开发者

How to filter by more than 1 habtm association

I'm pretty new at Rails, so don't kill me if this a stupid question =P

I have the following models:

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

I'm looking for an elegant way (without writing sql joins or anything, if possible) to get all the profiles that have a particular sector and a particular language.

I've googled but all I could find is how to do i开发者_如何学Ct for 1 habtm, but I need it for 2.

All I have is the following:

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

But I don't know then how to add the filter by language_id without messing with joins conditions or writing sql, and of course, all in one query... Is there a clean/elegant way to do this?

Thanks!


In your example above you've already generated 2 sql requests,

  1. first Sector.find(#id) (select on sectors table to get record with id == #id)

  2. second .profiles (select on profiles table to get all profiles with following sector - in this select you already have inner join profiles_selectors on profiles_selectors.profile_id = profiles.id generated automatically by rails)

I hope this is what you are looking for: (but I use :joins key)

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

Result of this method is 1 sql query and you get profiles filtered by language and sector.

Best regards

Mateusz Juraszek


Try this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜