Как создать модель, которая будет связана с двумя родительскими моделями
Я новичок в рельсах и все еще изучаю ассоциации, и я застрял в модельных отношениях.
У меня есть модель, которую я хочу связать с двумя родительскими моделями, чтобы при создании экземпляра этой модели он автоматически связывался с двумя родительскими моделями. Я не уверен, полиморфные ли это отношения или нет. Если это так, может кто-нибудь показать мне, как обрабатывать создание, чтобы оно создавало правильные ссылки. Я не совсем понимаю полиморфные отношения из документов.
В настоящее время я делаю создание с одной моделью и добавляю запись к другой модели. Я хотел бы думать, что есть способ сделать это автоматически, но я не уверен, как это сделать.
Текущая реализация:
entry = @pool.entries.create(new_entry_params)
current_user.entries << entry
current_user.save
Я хочу настроить его таким образом, чтобы я мог легко показать все записи для конкретного пользователя как из экземпляра пользователя, так и из экземпляра пула.
Вот что у меня есть для настройки модели / базы данных:
Модели:
class User < ActiveRecord::Base
has_many :pools, through: :pool_memberships, dependent: :destroy
has_many :entries, dependent: :destroy
end
class Pool < ActiveRecord::Base
has_many :users, through: :pool_memberships, dependent: :destroy
has_many :entries, dependent: :destroy
end
class Entry < ActiveRecord::Base
belongs_to :user
belongs_to :pool
end
Таблица миграции для входа:
class CreateEntries < ActiveRecord::Migration
def change
create_table :entries do |t|
t.references :pool, index: true
t.references :user, index: true
t.string :name
t.integer :pool_id
t.integer :user_id, index: true
t.timestamps
end
end
end
Это "Rails" способ сделать это? Или я далеко от базы. Спасибо за любую помощь!
2 ответа
Прежде всего, вам не нужно current_user.save
как вы не изменили объект current_user.:)
Это должно сделать трюк:
@pool.entries.create(new_entry_params.merge(:user_id => current_user.id))
В ActiveRecord полиморфные отношения - это отношения, в которых модель может иметь одного из нескольких возможных родителей, но у нее все равно будет только один родитель. Это полиморфно, потому что вы не знаете, какой будет родительский тип, но вы должны иметь возможность обращаться с ними взаимозаменяемо. Но так как вы хотите, чтобы у вашей модели было два родителя одновременно, это не то, что вы хотите.
Ваша реализация выглядит хорошо, хотя нет причин вызывать current_user.save. Проверьте это, вы увидите, что в этом случае оператор << на самом деле запускает вставку базы данных в таблицу соединений.