Что было бы хорошим способом моделирования взаимозаменяемых элементов в Rails 3?

#ruby-on-rails #activerecord #foreign-key-relationship #has-many #belongs-to

#ruby-on-rails #activerecord #foreign-key-relationship #имеет-много #принадлежит-к

Вопрос:

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

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

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

Поскольку я не знаю, сколько взаимозаменяемых продуктов может иметь каждый продукт (скажем, есть 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. Похоже, было бы более практично создать систему ввода «продукта», а не индивидуально связывать все возможные отношения? Кроме того, кажется, что взаимозаменяемые продукты — это просто продукты, так что a has_many:through может быть более чистой моделью.

2. как я уже сказал, я слишком долго ломал голову над этим. Я должен был думать о взаимозаменяемом продукте как о взаимозаменяемом продукте. Опять я что — то путаю в голове … Спасибо тебе, Дэйв!!

Ответ №1:

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

 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
 

Надеюсь, это будет кому-то полезно.