如何使用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, :class_name => \"User\", :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, :class_name => \'Message\', :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
。     

要回复问题请先登录注册