0

我是 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

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

谢谢!

4

2 回答 2

1

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

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

  2. 第二个 .profiles (在配置文件表上选择以获取具有以下扇区的所有配置文件 - 在此选择中,您已经在 profiles_selectors.profile_id =profiles.id 上由 rails 自动生成了内部连接 ​​profiles_selectors)

我希望这是您正在寻找的:(但我使用 :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 查询,您会获得按语言和部门过滤的配置文件。

最好的祝福

Mateusz Juraszek

于 2010-11-08T22:26:50.483 回答
1

试试这个:

Profile.all(:joins => [:sectors, :languages], 
  :conditions => ["sectors.id = ? AND languages.id ?", sector_id, language_id])
于 2010-11-08T22:26:50.940 回答