Rails:加入多个条件

时间:2011-03-21 11:16:31

标签: ruby-on-rails-3 activerecord join

我有一个像

这样的简单模型
class Interest < ActiveRecord::Base
  has_and_belongs_to_many :user_profiles
end

class UserProfile < ActiveRecord::Base
  has_and_belongs_to_many :interests
end

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

UserProfile.joins(:interests).where('interests.id = ?', an_interest)

但我怎样才能找到有多种兴趣的用户?当然,如果我这样做

UserProfile.joins(:interests).where('interests.id = ?', an_interest).where('interests.id = ?', another_interest)

我总是得到一个空结果,因为在连接之后,没有行可以同时拥有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

3 个答案:

答案 0 :(得分:4)

(?)中的

是不好的 - 它是一个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

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

答案 1 :(得分:2)

这将使至少具有一个指定兴趣的用户。

UserProfile.joins(:interests).where(:id => [an_interest_id, another_interest_id])

为了获得具有两种指定兴趣的用户,我可能会这样做:

def self.all_with_interests(interest_1, interest_2)
  users_1 = UserProfile.where("interests.id = ?", interest_1.id)
  users_2 = UserProfile.where("interests.id = ?", interest_2.id)

  users_1 & users_2
end

效率不是很高,但它应该做你需要的吗?

答案 2 :(得分:0)

尝试IN (?)和数组:

UserProfile.joins(:interests).where('interests.id IN (?)', [1,2,3,4,5])