Рельсы Консольный откат на создание рельсов - PullRequest
2 голосов
/ 25 мая 2019

У меня есть кнопка под названием разговор, когда пользователь нажимает на нее, она создает разговор как запись в базе данных. Проблема в том, что если есть 3 пользователя userA, userB и userC,

Если пользователь B нажмет на кнопку разговора, чтобы отправить сообщение userA, это создаст запись разговора. но затем, если пользователь C нажмет на кнопку разговора, чтобы отправить сообщение userA, запись не сохранится, и я получу откат

enter image description here

контроллер разговора:

class ConversationsController < ApplicationController
before_action :authenticate_user!

def index
  @conversations = Conversation.involving(current_user)
end

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

private
  def conversation_params
    params.permit(:sender_id, :recipient_id)
  end
end

ошибка происходит в этой строке

    redirect_to conversation_messages_path(@conversation) 

модель разговора:

class Conversation < ApplicationRecord
  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
 validates_uniqueness_of :sender_id, :recipient_id

 scope :involving, -> (user) {
   where("conversations.sender_id = ? OR conversations.recipient_id = ?", user.id, user.id)
 }

scope :between, -> (user_A, user_B) {
  where("(conversations.sender_id = ? AND conversations.recipient_id = ?) OR (conversations.sender_id = ? AND conversations.recipient_id = ?)", user_A, user_B, user_B, user_A)
 }
end

ошибка произошла из-за этой строки

  validates_uniqueness_of :sender_id, :recipient_id

1 Ответ

2 голосов
/ 25 мая 2019

Ваша уникальность должна быть ограничена, в противном случае вы просто устанавливаете две независимые уникальности, и (в вашем примере) отправитель может иметь только один диалог во всей базе данных, а получатель может иметь только один разговор во всей базе данных.

Правильный способ сделать это ...

validates :sender_id, uniqueness: { scope: :recipient_id, message: "there is already a converation between these people" }

scoped означает, что для этого получателя может быть только одна запись с этим отправителем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...