ActiveRecord :: AssociationTypeMismatch, но ввод правильный - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь следовать руководству по уведомлениям GoRails и сталкиваюсь с проблемами.
Я получил ошибку ActiveRecord::AssociationTypeMismatch - User(#125297720) expected, got 1 which is an instance of Integer(#20118600): Странно, что 1 - это user_id, который я ищу, я просто не уверен, почему он не сохраняет его.

Код: messages_controller.rb

  def create
    @message = Message.create user: current_user,
                                       room: @room,
                                       message: params.dig(:message, :message)

    if @message.save!
      Notification.create!(recipient: @room.reciever_id, actor_id: current_user, action: "message", notifiable: @message)
      redirect_back(fallback_location: rooms_path)
    else
      render rooms_path
    end
  end

messages.rb

class Notification < ApplicationRecord
  belongs_to :recipient, class_name: "User"
  belongs_to :actor, class_name: "User", optional: true
  belongs_to :notifiable, polymorphic: true

  scope :unread, -> {where(read_at: nil)}
end

user.rb

  has_many :messages, :class_name => "Message", :foreign_key => "user_id"
  has_many :rooms, :foreign_key => "sender_id"

  has_many :notifications, foreign_key: :recipient_id

room.rb

class Room < ApplicationRecord
  belongs_to :user
  has_many :messages, dependent: :destroy,
         inverse_of: :room
  has_many :users, {:through=>:messages, :source=>"user"}

end

message.rb

class Message < ApplicationRecord
  belongs_to :user, :class_name => 'User', :foreign_key => "user_id"
  belongs_to :room, inverse_of: :messages


  def as_json(options)
    super(options).merge(user_name: [user.first_name, user.last_name].compact.join(' '))
  end
end

если я изменю @ room.reciever_id на current_user в Notification.создать, он работает нормально

1 Ответ

1 голос
/ 20 февраля 2020

С этим прямо здесь:

 Notification.create!(recipient: @room.reciever_id, actor_id: current_user

вы в основном делаете это задом наперед - вы передаете id как recipient и запись как actor_id.

Помните, что если вы используете поле _id, вы должны передавать идентификатор, а если вы используете имя ассоциации (например, recipient), вы должны передать фактическая запись:

должно работать следующее:

 Notification.create!(recipient_id: @room.reciever_id, actor_id: current_user.id

Если у вас была ассоциация receiver на Room, вы можете сказать:

 Notification.create!(recipient: @room.reciever, actor: current_user

однако это производительность немного хуже, поскольку она выполняет еще один поиск в базе данных (запрашивая весь объект @room.receiver вместо чтения receiver_id непосредственно с @room)

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