如何解决如何使用Rails查找一个has_many而不是另一个?
| 消息has_many user_messages。它有两个。 1个UserMessage将发送者作为user_id 另一个UserMessage将接收者作为user_id 知道一个用户后,对于任何消息,我怎么能找到另一个? 这是我尝试作为Message类方法的尝试,但失败了: 32 def other_user(one_user)
33 um = self.user_messages
34 um.each do |user_message|
35
36 output_user = User.find(user_message.user_id) unless user_message.user_id == one_user.id
37 end
38
39 return output_user
40 end
解决方法
这可以实现为关联增强。对于将消息推送到DB的大量消息,这将非常有效。
class User < ActiveRecord::Base
has_many :sent_messages,:class_name => \"Message\",:foreign_key => \"sender_id\"
has_many :receivers,:through => :sent_messages,:source => :receiver do
def for_message(message_id)
where(\"messages.id = ?\",message_id)
end
end
# Another association mapping for received_messages
end
class Message < ActiveRecord::Base
belongs_to :sender,:class_name => \"User\",:foreign_key => \"sender_id\"
belongs_to :receiver,:foreign_key => \"receiver_id\"
end
#Usage
User.first.sent_messages
#all users received messages from first user
User.first.receivers
#all users received messages from first user for message of message_id
User.first.receivers.for_message(message_id)
, 似乎应该更好地定义谁是ѭ2who和谁是ѭ3better,但是与此同时,该怎么办:
def other_user(one_user)
user_messages.reject do |msg|
msg.user_id == one_user.id
end.first.user
end
它取user_messages
的集合,过滤掉属于one_user
的那个。阵列中应该还剩下一个,因此请挑选出来并返回附加给它的用户。
编辑
我可能无法理解您的所有要求,但可能会直接在Message
中添加sender_id
和receiver_id
并删除UserMessage
连接表。然后可以定义如下关系:
class User
has_many :sent_messages,:class_name => \'Message\',:foreign_key => \'sender_id\'
has_many :received_messages,:foreign_key => \'receiver_id\'
end
class Message
belongs_to :sender,:class_name => \'User\'
belongs_to :recipient,:class_name => \'User\'
end
编辑2
如果您想要中间表来跟踪用户特定的状态,则可以考虑使用STI将ѭ10class子类化为SentMessageLink
和ѭ14th(这些名字虽然不太好,但是您知道了),然后可以使用has_many :through
。
class SentMessageLink < UserMessage
belongs_to :sender,:class_name => \'User\'
belongs_to :message
end
class User
has_many :sent_message_links
has_many :sent_messages,:through => :sent_message_links
end
class Message
has_one :sent_message_link
has_one :sender,:through => :sent_message_link
end
与接收邮件的类似代码。然后,您应该可以直接从消息中访问sender
和receiver
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。