用于检查多个条件的轨道

时间:2014-09-11 10:21:25

标签: mysql ruby-on-rails activerecord active-relation

在rails中跟踪查询是否有任何简短的方法:

Message.where("(user_id = 8 AND  commentable_id= 84) OR (user_id=84 AND commentable_id=8) ")

由于

2 个答案:

答案 0 :(得分:3)

在可读性方面,也许您正在寻找Arel,例如:

class Message < ActiveRecord::Base
  def self.user_id_and_comment_id user_id, comment_id
    where user_and_comment(user_id, comment_id).or(user_and_comment comment_id, user_id)
  end
  private
  def self.user_and_comment user_id, comment_id
    table[:user_id].eq(user_id).and(table[:commentable_id].eq comment_id)
  end

  def self.table
    self.arel_table
  end
end

Message.user_id_and_comment_id 8, 84

将内容提取到单独的模型和范围中有助于大量编写查询并使其可以重用于其他相关查询。 顺便说一句。我假设您没有将ID硬编码到SQL中。

答案 1 :(得分:3)

我认为这应该有效:

arr = [8, 84] Message.where(user_id: arr, commentable_id: arr)

以上查询将有4种组合:

USER_ID commentable_id

  1. 8 8
  2. 8 84
  3. 84 8
  4. 84 84
  5. 在上述组合中,第1和第4组无效。因此,它应该会得到你的结果。