Rails - 在ActiveRecord中在运行时添加自定义字段

Ben*_*man 7 activerecord ruby-on-rails

您知道一些bug跟踪器(和其他软件)如何允许您添加自定义字段?

通常,这是通过如下所示的数据结构完成的:

  Items
----------
 ID | NAME | ITEM_TYPE_ID


 FieldDefinitions
---------------------------------------
 ID | ITEM_TYPE_ID | FIELD_NAME | FIELD_TYPE

 FieldValues
---------------------------------------
ID | FIELD_ID | ITEM_ID | VALUE
Run Code Online (Sandbox Code Playgroud)

我试图找出在Rails中实现这种设计的最佳方法.我想要允许扩展简单属性的许多模型.

当我进行检索时,Item我希望它包含已为该模型定义的加法字段值的哈希值.

Mik*_*ffe 6

就像是...?

class Item < ActiveRecord::Base
  has_many :field_values
  has_many :field_definitions, :through => :field_values

  def custom_fields_hash
    cfh = {}
    self.field_values.each |fv|
      cfh[fv.field_definition] = fv
    end
    cfh
  end
end

class FieldValue < ActiveRecord::Base
  belongs_to :item
  belongs_to :field_definition
end

class FieldDefinition < ActiveRecord::Base
  has_many :field_values
  has_many :items, :through => field_values
end
Run Code Online (Sandbox Code Playgroud)

或者,你可以改变

cfh[fv.field_definition] = fv
Run Code Online (Sandbox Code Playgroud)

...至...

cfh[fv.field_definition.field_name] = fv.value
Run Code Online (Sandbox Code Playgroud)

  • 使用注入可能是更好的形式。像 self.field_values.inject({}) { |memo, fv| 备忘录[fv.field_definition] = fv } 或类似的。 (2认同)