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