Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 两个基于键的外键与同一类有许多关联—;如何在单个方法调用中返回两个关联的结果?_Ruby On Rails_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 两个基于键的外键与同一类有许多关联—;如何在单个方法调用中返回两个关联的结果?

Ruby on rails 两个基于键的外键与同一类有许多关联—;如何在单个方法调用中返回两个关联的结果?,ruby-on-rails,ruby-on-rails-3.2,Ruby On Rails,Ruby On Rails 3.2,我正在构建一个小应用程序,用户可以在其中发送和接收消息。每封邮件都有一个发件人id和一个收件人id(都包含用户id) 在我的用户模型中,我可以做什么来调用@User.all_messages,并为该用户返回已发送和已接收的消息 (我使用的是Rails 3.2)使用有很多关联是不可能的。我会这样做: def all_messages Message.where("sender_id = ? OR recipient_id = ?", self.id, self.id) end 通过这种方式,

我正在构建一个小应用程序,用户可以在其中发送和接收消息。每封邮件都有一个
发件人id
和一个
收件人id
(都包含用户id)

在我的用户模型中,我可以做什么来调用
@User.all_messages
,并为该用户返回已发送和已接收的消息


(我使用的是Rails 3.2)

使用
有很多关联是不可能的。我会这样做:

def all_messages
  Message.where("sender_id = ? OR recipient_id = ?", self.id, self.id)
end

通过这种方式,您仍然可以向其附加其他筛选器。

我喜欢这段代码的简洁性,而且它确实可以返回所有这两个关联-尽管它(似乎)是通过进行两次DB查询,然后将第二组结果附加到第一组结果来实现的。对于我的特殊情况,能够进一步过滤/排序结果非常重要(对于在一个连续的时间轴中渲染),并且我无法成功地在此方法上调用“@user.all_messages.order()”。在查询级别处理组合似乎更有效,并将结果作为单个返回集处理。另外:我还没有测试过这一点,但我会担心返回重复项的可能性。例如,如果一个用户向他/她发送了一条消息,我相信这会返回该消息两次(一次作为sent_messages集合的元素,一次作为received_messages集合的元素)。需要注意的东西。这个效果很好,谢谢。在查询级别处理组合并将结果作为一个统一集返回(然后我可以对其进行排序/筛选),这将使它成为我今后非常有用的方法。
def all_messages
   sent_messages + received_messages
end
def all_messages
  Message.where("sender_id = ? OR recipient_id = ?", self.id, self.id)
end