Ваша пользовательская ассоциация с беседами ищет только sender_id
has_many :conversations, :foreign_key => :sender_id, dependent: :destroy
Пользователь-получатель ищет беседу со своим идентификатором как sender_id
, а не как recipient_id
.
Я думаю, вы можете исправить это, добавив модель соединения между пользователями и беседами вместо разговора, принадлежащего только отправителю и получателю (хотя вы должны сохранить эти ссылки в любом случае).
Что-то вроде
class ConversationsUsers < ....
belongs_to :user
belongs_to :conversation
end
class User < ...
has_many :conversations_users
has_many :conversations, through: :conversations_users
has_many :started_conversations, class_name: 'Conversation', foreign_key: :sender_id
has_many :received_conversations, class_name: 'Conversation', foreign_key: :recipient_id
end
class Conversation < ...
has_many :convesations_users
end
Для каждого разговора у вас будет две записи в таблицеversations_users, по одной для каждого пользователя.Теперь оба пользователя могут запрашивать все беседы независимо от того, являются ли они отправителем или получателем (и вы можете иметь любое количество участников беседы, если вы планируете ее расширять!).
Вам придется создатьхотя некоторые записи вручную, после создания беседы вы можете иметь функцию обратного вызова после, чтобы создать два объекта разговор_пользователя по одному для каждого пользователя.
Другой вариант - просто использовать метод
def conversations
Conversation.where(sender_id: id).or(Conversation.where(recipient_id: id))
end
но вы не сможете использовать объединения / включения / и т.д.
РЕДАКТИРОВАТЬ: чтобы получить все сообщения, добавьте другой метод:
def messages
conv_ids = conversations.pluck(:id)
Message.where(conversation_id: conv_ids)
end
, затем вы можете это сделать, чтобы все прочиталисообщения, например
current_user.messages.where(read: true)