我们假设我正在创建一个产品目录,我希望能够动态创建产品属性。我定义的数据模型如下所示:
class Collection < ActiveRecord::Base
has_many :items
has_many :item_attributes
end
class Item < ActiveRecord::Base
belongs_to :collection
has_many :item_attribute_values
end
class ItemAttribute < ActiveRecord::Base
belongs_to :collection
has_many :item_attribute_values
end
class ItemAttributeValue < ActiveRecord::Base
belongs_to :item_attribute
belongs_to :item
end
这个用于支持的用例是可以存在各种集合的用例,每个集合都有自己的项目。用户可以为每个集合创建自定义属性。然后,用户为集合中的每个项填充自定义属性。
一个例子: 对于漫画书的集合,将跟踪的属性为作者和 Inker 。项目&#34;蝙蝠侠#1&#34;,将拥有&#39; Bob Kane&#39;和&#39; John Doe&#39;在属性值表中。物品&#34;蜘蛛侠#1&#34;,将有&#39; Stan Lee&#39;和&#39; Jane Doe&#39;在属性值表中。
对于汽车的集合,将跟踪的属性为年和里程。项目&#34; Honda Civic&#34;,将有&#39; 2013&#39;和&#39; 55000 Doe&#39;在属性值表等等
如果我想列出与网页上特定项目相关联的所有属性键,值对,那么从数据库中检索它们的最佳和最有效的方法是什么?是否有更好的数据模型来支持此功能?
答案 0 :(得分:0)
我在类似情况下所做的是在需要此类功能的类中定义to_h()方法
class Item
def to_h
item_attribute_values.reduce({}) do |m, iav|
m[iav.name] = iav.value
m
end
end
end
您可以将其放入模块中,只需将其包含在您的课程中
即可答案 1 :(得分:0)
对于任何可能关心的人,答案实际上最终成为一个看起来像这样的ActiveRecord问题:
@item_details = Item.includes(collection: [{item_attributes: :item_attribute_values}]).find_by_id(@item.id)