如何按 1 个以上的 Habtm 关联进行过滤

发布于 2024-10-01 09:22:28 字数 706 浏览 3 评论 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

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

谢谢!

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 it 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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

魔法少女 2024-10-08 09:22:29

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

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

  2. 第二个 .profiles(在配置文件上选择
    获取所有配置文件的表
    以下部门 - 在此选择
    你已经有内部连接
    配置文件选择器打开
    profile_selectors.profile_id =
    由rails自动生成的profiles.id)

我希望这就是您正在寻找的:(但我使用: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

此方法的结果是1个sql查询,您将获得按语言和部门过滤的配置文件。

最好的问候

Mateusz Juraszek

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

黯淡〆 2024-10-08 09:22:29

试试这个:

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

Try this:

Profile.all(:joins => [:sectors, :languages], 
  :conditions => ["sectors.id = ? AND languages.id ?", sector_id, language_id])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文