如何过滤超过1 habtm关联

时间:2010-11-08 20:30:17

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

我在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,当然,所有这些都在一个查询中...是否有一个干净/优雅的方法来执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

  1. 第一个Sector.find(#id)(选择 扇区表得到记录 id == #id)

  2. 第二个.profiles(在个人资料中选择 用于获取所有配置文件的表 以下部门 - 在此选择中 你已经有了内部联接 profiles_selectors on profiles_selectors.profile_id = profiles.id由rails自动生成)

  3. 我希望这就是你要找的东西:(但我使用:加入密钥)

    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

答案 1 :(得分:1)

试试这个:

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