代码之家  ›  专栏  ›  技术社区  ›  empz

如何通过多个habtm关联进行过滤

  •  0
  • empz  · 技术社区  · 15 年前

    我有以下型号:

    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连接或任何东西)来获取具有特定扇区和特定语言的所有配置文件。

    我已经搜索过了,但我能找到的只是如何为1habtm,但我需要它为2。

    我只有以下几点:

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

    但是我不知道如何在不干扰连接条件或编写sql的情况下添加按语言id筛选,当然,还有一个查询。。。有没有一种干净/优雅的方法可以做到这一点?

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mateusz Juraszek    15 年前

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

    1. 第一个扇区。查找(#id)(选择打开 带id=#id)

    2. 第二,配置文件(在配置文件上选择 用于获取所有配置文件的表 你已经有内部连接了 配置文件选择器打开 配置文件选择器。配置文件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查询,您将得到按语言和扇区筛选的配置文件。

    马泰乌斯·尤拉斯泽克

        2
  •  1
  •   Harish Shetty    15 年前

    试试这个:

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