#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
на thishas_many :favorites, as: :favorited, dependent: :destroy
в обеих моделях product amp; variant? И все остальное остается прежним?