Rails:加入多个条件

Fil*_*evi 8 activerecord join ruby-on-rails-3

我有一个简单的模型

class Interest < ActiveRecord::Base
  has_and_belongs_to_many :user_profiles
end

class UserProfile < ActiveRecord::Base
  has_and_belongs_to_many :interests
end
Run Code Online (Sandbox Code Playgroud)

当我想查询具有特定兴趣的所有用户时,这很简单

UserProfile.joins(:interests).where('interests.id = ?', an_interest)
Run Code Online (Sandbox Code Playgroud)

但是,我如何找到有多个兴趣的用户?当然,如果我这样做

UserProfile.joins(:interests).where('interests.id = ?', an_interest).where('interests.id = ?', another_interest)
Run Code Online (Sandbox Code Playgroud)

我总是得到一个空结果,因为在连接之后,没有行可以同时拥有interest.id = an_interest和interest.id = another_interest.

ActiveRecord中有没有办法表达"我想要有2个(指定)兴趣的用户列表?

更新(解决方案)这是我提出的第一个工作版本,感谢Omar Qureshi

    specified_interests.each_with_index do |i, idx|
      main_join_clause = "interests_#{idx}.user_profile_id = user_profiles.id"
      join_clause = sanitize_sql_array ["inner join interests_user_profiles interests_#{idx} on
                    (#{main_join_clause} and interests_#{idx}.interest_id = ?)", i]

      relation = relation.joins(join_clause)
    end
Run Code Online (Sandbox Code Playgroud)

Oma*_*shi 4

in (?) 不好 - 它是一个类似 OR 的表达式

您需要做的是手动编写多个连接

profiles = UserProfile
interest_ids.each_with_index do |i, idx|
  main_join_clause = "interests_#{idx}.user_profile_id = user_profiles.id"
  join_clause = sanitize_sql_array ["inner join interests interests_#{idx} on
                        (#{main_join_clause} and interests_#{idx}.id = ?)", i]
  profiles = profiles.join(join_clause)
end
profiles
Run Code Online (Sandbox Code Playgroud)

您可能需要更改 main_join_clause 以满足您的需求。