问题描述
|
消息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
。