Похоже, должно быть лучшее определение того, кто является sender
, а кто receiver
, но пока что:
def other_user(one_user)
user_messages.reject do |msg|
msg.user_id == one_user.id
end.first.user
end
Он принимает набор user_messages
, отфильтровывает тот, который принадлежит one_user
. В массиве должен остаться один элемент, поэтому выберите его и верните присоединенного к нему пользователя.
EDIT
Возможно, я не понимаю все ваши требования, но я бы, вероятно, просто добавил sender_id
и receiver_id
непосредственно к Message
и удалил таблицу соединения 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 для подкласса UserMessage
как SentMessageLink
и ReceivedMessageLink
(эти имена не удивительны - но вы поняли идею), тогда вы можете использовать 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
прямо из сообщения.