1

是否有任何捷径可以在 Rails 中纠正以下查询:

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

谢谢

4

2 回答 2

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 中。

于 2014-09-11T10:48:47.377 回答
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

在上述组合中,第 1 和第 4 无效。因此,它应该为您带来结果。

于 2014-09-11T13:21:03.197 回答