Rails: избранная система — модели ассоциаций

#ruby-on-rails #ruby-on-rails-5

#ruby-на-рельсах #ruby-on-rails-5

Вопрос:

У меня есть следующая настройка ассоциаций моделей, когда потребитель может выбрать продукт или вариант. Я просто хотел спросить, верен ли мой подход?

 class Favorite < ApplicationRecord
  belongs_to :consumer
  belongs_to :favorited, polymorphic: true
  belongs_to :product, optional: true
  belongs_to :variant, optional: true
end

class Consumer < ApplicationRecord
  has_many :favorites
  has_many :favorite_products, through: :favorites, source: :favorited, source_type: 'Product'
  has_many :favorite_variants, through: :favorites, source: :favorited, source_type: 'Variant'
end

class Product < ApplicationRecord
  has_many :favorites, dependent: :destroy
end

class Variant < ApplicationRecord
  has_many :favorites, dependent: :destroy
end

class CreateFavorites < ActiveRecord::Migration[6.0]
  def change
    create_table :favorites do |t|
      t.references :consumer, index: true
      t.references :favorited, polymorphic: true, index: true
      t.integer :product_id
      t.integer :variant_id

      t.timestamps
    end
  end
end
 

Комментарии:

1. Взгляните на это schmidt-happens.com/articles/2014/06/04 /. … Это может вам помочь!

2. Спасибо за помощь @Theopap. Я уже прочитал это. На основе этой настройки я создал свои ассоциации моделей. Но в моем случае вместо проекта у меня есть продукты и варианты. Все еще не уверен, что то, что я придумал, является правильным подходом. Любые идеи, если ассоциации моделей, которые у меня есть, верны?

Ответ №1:

Непонятно, почему у вас есть как полиморфное favorited , так и отдельное отношение product_id/variant_id . Обычно можно использовать один из этих подходов. Полиморфные ассоциации тоже могут быть однонаправленными — has_many :favorites, as: :favorited, dependent: :destroy

Если вы используете отдельные столбцы для каждого отношения — индексы включены product_id , а variant_id также могут быть полезны для предотвращения полного сканирования таблицы при удалении продукта / варианта (включено dependent: :destroy , также, если вы не ожидаете обратных вызовов / вложенных отношений там — delete_all быстрее).

Комментарии:

1. Спасибо за ответ @Vasfed. Итак, вы в основном предлагаете удалить product_id amp; variant_id из миграции и заменить это has_many :favorites, dependent: :destroy на this has_many :favorites, as: :favorited, dependent: :destroy в обеих моделях product amp; variant? И все остальное остается прежним?