【问题标题】:How to filter by more than 1 habtm association如何按超过 1 个 habtm 关联进行过滤
【发布时间】:2010-11-08 20:30:16
【问题描述】:

我是 Rails 的新手,所以如果这是一个愚蠢的问题,请不要杀了我 =P

我有以下型号:

class Profile < ActiveRecord::Base
has_and_belongs_to_many :sectors
has_and_belongs_to_many :languages

class Sector < ActiveRecord::Base
  has_and_belongs_to_many :profiles
end

class Language < ActiveRecord::Base
  has_and_belongs_to_many :profiles
end

我正在寻找一种优雅的方式(如果可能,无需编写 sql 连接或任何东西)来获取具有特定部门和特定语言的所有配置文件。

我已经用谷歌搜索了,但我只能找到如何为 1 个 habtm 执行此操作,但我需要 2 个。

我只有以下几点:

def some_method(sector_id, language_id)
   Sector.find(sector_id).profiles
end

但是我不知道如何通过 language_id 添加过滤器而不会弄乱连接条件或编写 sql,当然,所有在一个查询中......有没有一种干净/优雅的方式来做到这一点?

谢谢!

【问题讨论】:

  • 真的有“rails”的方法吗?还是我只是在做梦? =P....如果没有请告诉我,我会使用正常的 :join 和其他东西。

标签: ruby-on-rails activerecord has-many


【解决方案1】:

在上面的示例中,您已经生成了 2 个 sql 请求,

  1. 第一个 Sector.find(#id)(选择 获取记录的扇区表 id == #id)

  2. 第二个 .profiles(在配置文件上选择 获取所有配置文件的表 以下部门 - 在此选择中 你已经有内部连接 profile_selectors 上 profile_selectors.profile_id = profile.id 由 rails 自动生成)

我希望这是你要找的:(但我使用 :joins 键)

class Profile < ActiveRecord::Base
  has_and_belongs_to_many :sectors
  has_and_belongs_to_many :languages

  def self.some_method(language_id, sector_id)
    all(:conditions => ["languages.id = ? and sectors.id = ?", language_id, sector_id], :joins => [:languages, :sectors])
  end
end

此方法的结果是 1 次 sql 查询,您会获得按语言和部门过滤的配置文件。

最好的问候

马特乌斯·尤拉泽克

【讨论】:

  • 虽然它使用了:joins,但相当干净,猜猜它就是这样做的。谢谢=)
【解决方案2】:

试试这个:

Profile.all(:joins => [:sectors, :languages], 
  :conditions => ["sectors.id = ? AND languages.id ?", sector_id, language_id])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多