Как создать модель, которая будет связана с двумя родительскими моделями

Я новичок в рельсах и все еще изучаю ассоциации, и я застрял в модельных отношениях.

У меня есть модель, которую я хочу связать с двумя родительскими моделями, чтобы при создании экземпляра этой модели он автоматически связывался с двумя родительскими моделями. Я не уверен, полиморфные ли это отношения или нет. Если это так, может кто-нибудь показать мне, как обрабатывать создание, чтобы оно создавало правильные ссылки. Я не совсем понимаю полиморфные отношения из документов.

В настоящее время я делаю создание с одной моделью и добавляю запись к другой модели. Я хотел бы думать, что есть способ сделать это автоматически, но я не уверен, как это сделать.

Текущая реализация:

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. Проверьте это, вы увидите, что в этом случае оператор << на самом деле запускает вставку базы данных в таблицу соединений.

Другие вопросы по тегам