Как правильно настроить эти отношения ActiveRecord? - PullRequest
1 голос
/ 04 августа 2011

У меня проблема с пониманием того, как правильно установить отношения ActiveRecord для следующих сценариев ...

Теперь у меня есть это дерево продуктов:

Product 
-> ProductTypes 
   -> Subtypes 
     -> Subtypes 
       -> ... 
         -> Subtypes 
           -> ProductItem

где Product:

class Product < ActiveRecord::Base
  has_many :product_types
  has_one :product_item, :foreign_key => "product_id"
end

ProductType и Subtype:

class ProductType < ActiveRecord::Base
  belongs_to :product
  belongs_to :parent_type, :class_name => "ProductType"
  has_many :subtypes, :class_name => "ProductType", :foreign_key => "parent_type_id"
  has_one :product_item
end

и ProductItem:

class ProductItem < ActiveRecord::Base
  belongs_to :product_type
  belongs_to :product
end

Но я также хочу, чтобы дерево позволило Product иметь *Только 1016 * (т.е. без подтипов), например:

Product 
-> ProductItem

Как я могу настроить их для выполнения этих требований?Спасибо!

1 Ответ

0 голосов
/ 04 августа 2011

Это зависит от того, что такое ProductType. Если это категоризация, то может иметь смысл иметь такую ​​ассоциацию has_many: product_types. Если то, что вы действительно хотите, это разные типы продуктов, то я бы использовал STI, чтобы сделать вашу жизнь немного проще. Кроме того, я бы упростил product_item до простого элемента, если у вас нет веских причин для этого.

http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

STI Way Добавьте миграцию в таблицу «Продукты», чтобы добавить столбец типа:

add_column :products, :type, :string

Затем измените ваши модели следующим образом:

product.rb

class Product < ActiveRecord::Base
  has_one :item
end

type_1.rb

class Type1 < Product
end

type_2.rb

class Type2 < Product
end

и т.д.

Для ваших подтипов я бы сделал то же самое (например, type1):

subtype_1.rb

class Subtype1 < Type1
end

Так что теперь у всех ваших различных типов и подтипов есть элемент, связанный с ними. Теперь ваш предмет просто связан с продуктом, и все готово.

item.rb

class Item < ActiveRecord::Base
  belongs_to :product
end

Если это не то, что вы хотите, тогда я буду рад изменить мой ответ, если вы предоставите больше ясности.

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