#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
Надеюсь, это будет кому-то полезно.