某些联合查询-rails的sql语句

某些联合查询-rails的sql语句,sql,ruby-on-rails,ruby,associations,rails-activerecord,Sql,Ruby On Rails,Ruby,Associations,Rails Activerecord,假设我有一个带有sender和receiver属性的Message模型。rails获取两个用户之间交换的所有消息的方式是什么?我写了一些范围和 scope :some_scope, lambda { |sender = nil, receiver = nil| where({:sender_id => sender, :receiver_id => receiver})} 然后我连接了消息。一些\u范围(一些\u接收者,一些\u发送者)和消息。一些\u范围(一些\u发送者,一些\u

假设我有一个带有
sender
receiver
属性的
Message
模型。rails获取两个用户之间交换的所有消息的方式是什么?我写了一些范围和

scope :some_scope, lambda { |sender = nil, receiver = nil| where({:sender_id => sender, :receiver_id => receiver})}

然后我连接了
消息。一些\u范围(一些\u接收者,一些\u发送者)
消息。一些\u范围(一些\u发送者,一些\u接收者)
,但我认为这不是一个最佳实践(顺便说一句,我在
rails
中没有找到一种简单的方法来实现
联合
语句)在这种情况下,最好使用类方法,因为它既复杂又需要参数。此外,您可以将您关心的两个条件结合在一起,而不是使用联合

def self.conversation(id1, id2)
  id1_to_id2 = where(sender_id: id1, receiver_id: id2).where_values.reduce(:and)
  id2_to_id1 = where(sender_id: id2, receiver_id: id1).where_values.reduce(:and)
  where(id1_to_id2.or(id2_to_id1))
end
现在,您可以执行以下操作:

Message.conversation(user1.id, user2.id)
这将为您提供
user1
user2

之间的所有消息,因此我认为可能更干净的应该是一个类方法,您应该使用类方法。不过这只是吹毛求疵。