Неизвестный атрибут при создании объекта ассоциации между двумя моделями - PullRequest
0 голосов
/ 28 июня 2018

Итак, у меня есть три модели: User, Event, которые имеют has_many through -Ассоциацию через Attendance. При создании отношения между пользователем и событием в rails console --sandbox, как user1.attended_events.build(event_id: event1.id), я получаю unknown attribute 'event_id' for Event и наоборот при написании event1.attendees.build(attendee_id: user1.id): unknown attribute 'attendee_id' for User.

Для Attendance Я создал такую ​​таблицу:

class CreateAttendances < ActiveRecord::Migration[5.1]
  def change
    create_table :attendances do |t|
      t.references :event, foreign_key: true
      t.integer :attendee_id

      t.timestamps
    end
    add_index :attendances, :attendee_id
    add_index :attendances, [:event_id, :attendee_id], unique: true
 end
end

Вот так выглядят мои модели (пользователи также могут создавать события):

User-модель:

class User < ApplicationRecord
   has_many :events, inverse_of: "creator", foreign_key: "creator_id" , dependent: :destroy

   has_many :attendances, class_name: "Attendance", inverse_of: "attendee", foreign_key: "attendee_id", dependent: :destroy
   has_many :attended_events, through: :attendances, source: :event
end

Event-модель:

class Event < ApplicationRecord
    belongs_to :creator, class_name: "User", foreign_key: "creator_id"

    has_many :attendances
    has_many :attendees, through: :attendances
end

Участники-модель:

class Attendance < ApplicationRecord
  belongs_to :event, inverse_of: :attendances
  belongs_to :attendee, class_name: "User", inverse_of: :attendances
end

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

1 Ответ

0 голосов
/ 28 июня 2018

Когда вы запускаете event1.attendees.build(some_params), вы пытаетесь создать нового пользователя, и да, модель User не имеет атрибута attendee_id.

Это должно быть event1.attendances.build(attendee_id: user1.id). То же самое для user1.attendances.build(event_id: event1.id).

UPDATE.

Не уверен, правильно ли я понял ваш вопрос в комментарии, но я постараюсь ответить.

Давайте представим, что у нас есть экземпляры user, event1 и event2 и user.attended_events == [event1, event2]. user не хочет больше участвовать в event2, поэтому вам нужно уничтожить эту ассоциацию.

User.attendances.find_by(event_id: event2.id).destroy

Это уничтожит только экземпляр посещаемости и станет user.attended_events == [event1]. И в массиве event2.attendees больше не будет user

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