Рельсы и полиморфные ассоциации - PullRequest
0 голосов
/ 10 октября 2018

У меня есть три модели: User, Company и Subscription.То, что я пытаюсь сделать, это то, что Subscription принадлежит либо User ИЛИ Company.

Чтобы попытаться выполнить это, я сослался на это руководство , но я былбезуспешно, поскольку создание записи продолжает откатываться.

вот моя Company модель:

# app/models/company.rb
class Company < ApplicationRecord
    has_many :subscriptions, dependent: :destroy, as: :imageable
end

вот моя User модель:

# app/models/user.rb
class User < ApplicationRecord
  has_many :subscriptions, dependent: :destroy, as: :imageable
end

и, наконец,вот моя Subscription модель:

class Subscription < ApplicationRecord
    belongs_to :imageable, polymorphic: true
end

Теперь, что касается файла миграции, это мой Subscription файл миграции:

class CreateSubscriptions < ActiveRecord::Migration[5.1]
  def change
    create_table :subscriptions do |t|
      t.references :imageable, polymorphic: true, index: true
      t.date :start_date
      t.date :stop_date

      t.timestamps
    end
  end
end

Насколько я вижу,это в значительной степени точно так же, как показывает гид, но он продолжает отступать.Вот вывод консоли rails:

Loading development environment (Rails 5.1.6)
2.5.1 :001 > Subscription.create(imageable_id: 1, start_date: Time.now, stop_date: 2.days.from_now)
   (8.6ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
   (0.2ms)  BEGIN
   (0.3ms)  ROLLBACK
 => #<Subscription id: nil, imageable_type: nil, imageable_id: 1, start_date: "2018-10-10", stop_date: "2018-10-12", created_at: nil, updated_at: nil> 
2.5.1 :002 > 

Вот мои вопросы:

  1. Почему существует поле imageable_type?Это создано t.references и если да, то мне это нужно?Могу ли я просто использовать imageable_id вместо t.references, как показывает другая часть предложения?
  2. Почему оно откатывается?Полиморфные ассоциации выполняются по-разному в Rails 5.x или что-то случайно?
  3. Согласно графику, показанному в руководстве, похоже, что изображение принадлежит imageable_id 4, тогда, если есть сотрудник ANDпроизводство с идентификатором 4, тогда изображение будет принадлежать обоим вместо одного или другого, как я пытаюсь сделать.Правильно?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

В вашей ассоциации тип Imageable будет содержать имя класса, а идентификатор imageble будет содержать идентификатор этого класса.Поэтому, если вы хотите создать подписку для пользователя, вы можете сделать следующее:

User.first.subcriptions.create(start_date: Time.now, stop_date: 2.days.from_now)

. Таким образом, он автоматически выберет идентификатор первого пользователя в идентификаторе с изображением и выберет «Пользователь» как тип изображения.

Если вы хотите создать подписку вручную, вы должны передать оба поля imageable type и imageble id, как показано ниже:

Subscription.create(imageable_id: 1, imageable_type: "User", start_date: Time.now, stop_date: 2.days.from_now)
  1. Почему существует поле imageable_type?Это создано t.references и если да, нужно ли мне это?Могу ли я просто использовать imageable_id вместо t.references, как показывает другая часть предложения?

=> imageable_type будет содержать класс ассоциированной модели, такой как «Пользователь» или «Компания»

Почему это откатывается?Полиморфные ассоциации сделаны по-разному в Rails 5.x или что-то случайно?

=> Нет, вы правильно настроили

Согласно графику, показанному в руководстве, похоже, что если изображение принадлежит imageable_id 4, то, если есть сотрудник И производство с идентификатором 4, то изображение будет принадлежать обоим вместо одного или одногодругой, как я пытаюсь достичь.Правильно?

=> Это зависит как от imageable_id, так и от imageble_type, так что комбинацией обоих этих способов вы получите запись.Если для imageable_id установлено значение 4, а для imageable_type указано «Picture», то будет получено изображение с идентификатором 4.

Пожалуйста, проверьте эту ссылку для понимания

0 голосов
/ 10 октября 2018

Для полиморфной ассоциации вы также должны передать imageable_type вместе с imageable_id.Вы этого не делаете, и именно поэтому это не работает, скорее всего (то есть могут быть и другие причины, я не знаю, но эта довольно очевидна).

imageable_type содержит название класса записи, с которой связана подписка.

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