Что было бы хорошим способом для моделирования взаимозаменяемых элементов в Rails 3? - PullRequest
0 голосов
/ 01 ноября 2011

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

Допустим, у нас есть Продукт, который содержит кучу разных молотков.Каждый молот имеет несколько атрибутов (вес, размер, цвет и т. Д.), Но все они могут забивать гвозди. Так что в этом отношении они взаимозаменяемы.Однако они не взаимозаменяемы с другими продуктами, такими как бензопила или кувалда.

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

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

Вот то, что у меня есть, но я не уверен, что это лучшее решение (это немного поздно, и мой разумначинает таять - это гораздо упрощенный пример, если мои таблицы самообращения):

class Product < ActiveRecord::Base

  has_many :interchangable_products, :dependent => :destroy
end


class InterchangableProduct < ActiveRecord::Base
  belongs_to :product, :class => "Product", :foreign_key => :product_id


  belongs_to :interchangable_with, :class_name => "InterchangableProduct", :foreign_key => :interchangable_with_id
  has_many   :interchangables, :class_name => "InterchangableProduct",  :inverse_of => :interchangable_with, :foreign_key => :interchangable_with_id

  validates :product_id, :presence => true, :uniqueness => [:scope => :interchangable_with_id]
end

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2011

Благодаря комментарию от Дейва Ньютона я пришел к решению, которое выглядит примерно так:

class InterchangeableProductRelationship < ActiveRecord::Base
  belongs_to :product, :class_name => "Product", :foreign_key => "product_id"
  belongs_to :interchangeable_product, :class_name => "Product", :foreign_key => "interchangeable_product_id"

  validates :product_id, :presence => true, :uniqueness => [:scope => :interchangeable_product_id]
end


class Product < ActiveRecord::Base
  has_many :relations_to, :foreign_key => 'product_id', :class_name => "InterchangeableProductRelationship"
  has_many :relations_from, :foreign_key => 'interchangeable_product_id', :class_name => "InterchangeableProductRelationship"  
  has_many :linked_to, :through => :relations_to, :source => :interchangeable_product
  has_many :linked_from, :through => :relations_from, :source => :product


  def interchanges_with
    self.linked_to | self.linked_from
  end 
end

Надеюсь, это кому-нибудь пригодится.

...