【问题标题】:How do I retrieve a list of key value pairs when using dynamic attributes?使用动态属性时如何检索键值对列表?
【发布时间】:2015-10-28 00:51:40
【问题描述】:

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

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

它旨在支持的用例是可以存在各种集合的用例,每个集合都有自己的项目。用户可以为每个集合创建自定义属性。然后,用户为集合中的每个项目填充自定义属性。

一个例子: 对于漫画书合集,将被跟踪的属性是AuthorInker。项目“蝙蝠侠 #1”的属性值表中将包含“Bob Kane”和“John Doe”。项目“蜘蛛侠 #1”的属性值表中将包含“Stan Lee”和“Jane Doe”。

对于汽车的集合,将被跟踪的属性是YearMileage。项目“Honda Civic”,在属性值表等中会有“2013”​​和“55000 Doe”等

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

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我在类似情况下所做的是在需要此类功能的类中定义一个 to_h() 方法

    class Item
      def to_h
        item_attribute_values.reduce({}) do |m, iav|
          m[iav.name] = iav.value
          m
        end
      end
    end
    

    你可以把它放在一个模块中,然后简单地将它包含在你的类中

    【讨论】:

    • 我实际上是指从数据库中获取所有信息的最佳方式。我会重新调整问题。
    【解决方案2】:

    对于任何可能关心的人来说,答案实际上最终是一个看起来像这样的 ActiveRecord 问题:

    @item_details = Item.includes(collection: [{item_attributes: :item_attribute_values}]).find_by_id(@item.id)
    

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2019-05-30
      • 1970-01-01
      • 2020-05-14
      • 2014-02-27
      • 1970-01-01
      • 2015-09-29
      • 2016-05-13
      • 2011-01-23
      相关资源
      最近更新 更多