使用动态属性时如何检索键值对列表?

时间:2015-10-23 18:09:59

标签: ruby-on-rails activerecord

我们假设我正在创建一个产品目录,我希望能够动态创建产品属性。我定义的数据模型如下所示:

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;在属性值表等等

如果我想列出与网页上特定项目相关联的所有属性键,值对,那么从数据库中检索它们的最佳和最有效的方法是什么?是否有更好的数据模型来支持此功能?

2 个答案:

答案 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)