Его не простая ошибка. Это довольно много, что неверно.
Если вам нужно отношение, при котором у пользователя может быть много событий, а событие может принадлежать многим пользователям, вам нужно создать таблицу соединений. Поскольку сохранение внешнего ключа в таблице пользователей или событий приведет к созданию отношений от одного до многих, что, вероятно, не является тем, что вы хотите.
class User < ApplicationRecord
has_many :user_events
has_many :events, through: :user_events
end
class Event < ApplicationRecord
has_many :user_events
has_many :users, through: :user_events
end
# this is a join model.
class UserEvent < ApplicationRecord
belongs_to :user
belongs_to :event
end
A has_many :through association
часто используется, чтобы создать много-ко-многим связи с другой моделью. Эта ассоциация указывает, что модель объявления может быть сопоставлена с нулем или более экземплярами другой модели , пройдя третью модель. http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association
Вы можете генерировать UserEvent
модели и миграцию, которая создает таблицу соединит работу:
rails g model user_event user:belongs_to event:belongs_to
Это создаст user_events
таблицы с user_id
и event_id
внешним ключом. Вы должны также откатить миграцию, которая создает таблицу пользователей и исправить:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.string :password_digest # !!!
t.integer :code
t.timestamps
end
end
end
Примечание добавление password_digest
колонки - это требуется для has_secure_password
. Если вы уже запустили эту миграцию на производственную базу данных или привержен и толкнул его, вы должны вместо этого создать отдельные миграции, которые фиксируют ошибки:
class AddPasswordDigestToUsers < ActiveRecord::Migration[5.0]
def change
add_column(:users, :password_digest, :string)
end
end
class RemoveEventFromUsers < ActiveRecord::Migration[5.0]
def change
remove_column(:users, :event)
end
end
Чтобы создать событие, которое связано с пользователем вы можете сделать :
event = user.events.new(name: "Dummy") # does not persist the record
event = user.events.create(name: "Dummy")
Вы можете все присвоить записи с любого конца с помощью лопаты оператора:
user.events << event
event.users << user
Является ли это подходящей ассоциацией для меня?
Моя основная цель для моего приложения - сделать так, чтобы пользователь имел partys и у этих сторон были песни.
Партия с одним пользователем звучит довольно хромой. Однако, если вы хотите создать особые отношения для пользователя вы можете создать отдельную ассоциацию:
class User < ApplicationRecord
has_many :user_events
has_many :events, through: :user_events
has_many :owned_events, class_name: 'Event', foreign_key: 'owner_id'
end
class Event < ApplicationRecord
has_many :user_events
has_many :users, through: :user_events
belongs_to :owner, class_name: 'User'
end
class AddOwnerIdToEvents < ActiveRecord::Migration[5.0]
def change
add_column(:events, :owner_id, :integer)
add_foreign_key(:events, :users, column: :owner_id)
end
end
Другой способ решения этой проблемы является добавление столбца UserEvent
присоединиться к модели, которая определяет, что ассоциация. Но это довольно далеко от вашего уровня мастерства.
Спасибо за очень подробное описание моей проблемы. Я закончил работу ассоциаций. Мой последний вопрос заключается в том, чтобы назначить каждому пользователю событие. Моя основная цель для моего приложения - сделать так, чтобы у пользователя были partys, и у этих сторон есть песни. Я иду в правильном направлении для этого приложения? – Aaron
Вы должны действительно прочитать руководства по направляющим [статья об ассоциациях] (http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association) и [интерфейс запросов активной записи] (http: //guides.rubyonrails.org/active_record_querying.html#joining-tables). – max
Хорошо, сделаем! :) – Aaron