【发布时间】:2014-09-11 10:21:24
【问题描述】:
是否有任何捷径可以在 Rails 中纠正以下查询:
Message.where("(user_id = 8 AND commentable_id= 84) OR (user_id=84 AND commentable_id=8) ")
谢谢
【问题讨论】:
标签: 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) ")
谢谢
【问题讨论】:
标签: mysql ruby-on-rails activerecord active-relation
我认为这应该可行:
arr = [8, 84]
Message.where(user_id: arr, commentable_id: arr)
以上查询将有 4 种组合:
user_id commentable_id
以上组合中,第 1 和第 4 种无效。因此它应该会给你带来结果。
【讨论】:
也许 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 中。
【讨论】: