соответствующая запись равна нулю для одного пользователя, но не для другого - PullRequest
0 голосов
/ 19 сентября 2018

у меня есть простая система обмена сообщениями, работающая между двумя пользователями.пользователь, создающий conversation, получает запись, к которой я могу получить доступ через User.find(sender_id).conversation.last, однако получатель получает => nil, если я пытаюсь получить доступ к User.find(recipient_id).conversation.last (ofc я заменил идентификаторы receient_id и sender_id на фактический идентификатор).

Однако оба пользователя получают сообщения, связанные с беседой, и могут общаться в чате.Я использую внешние ключи в соответствии с руководством Дана Малдер на Medium .я думаю, что это странно, потому что я ожидаю, что оба пользователя (получатель и отправитель) должны иметь доступ к записи для разговора, в который они вступают.Есть ли способ достичь этого?

мои модели:

User.rb

has_many :conversations, :foreign_key => :sender_id, dependent: :destroy
has_many :messages, through: :conversations

Conversation.rb

belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'

has_many :messages, dependent: :destroy

Message.rb

belongs_to :conversation
belongs_to :user

Контроллер разговоров:
цветные разговоры_контроллер.rb

def create
  if Conversation.between(params[:sender_id],params[:recipient_id]).present?
     @conversation = Conversation.between(params[:sender_id], params[:recipient_id]).first
   else
     @conversation = Conversation.create!(conversation_params)
   end
   redirect_to conversation_messages_path(@conversation)
end

У вас есть идея, как сделать разговор доступным для обоих пользователей?(это доступно, но не так, как мне нужно).

заранее спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Ваша пользовательская ассоциация с беседами ищет только 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...