我在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,当然,所有这些都在一个查询中...是否有一个干净/优雅的方法来执行此操作?
谢谢!
答案 0 :(得分:1)
在上面的示例中,您已经生成了2个sql请求,
第一个Sector.find(#id)(选择 扇区表得到记录 id == #id)
第二个.profiles(在个人资料中选择 用于获取所有配置文件的表 以下部门 - 在此选择中 你已经有了内部联接 profiles_selectors on profiles_selectors.profile_id = profiles.id由rails自动生成)
我希望这就是你要找的东西:(但我使用:加入密钥)
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])