Rails – 在ActiveRecord中在运行时添加自定义字段
您知道一些bug跟踪器(和其他软件)如何允许您添加自定义字段?
通常,这是通过如下所示的数据结构完成的:
Items ---------- ID | NAME | ITEM_TYPE_ID FieldDefinitions --------------------------------------- ID | ITEM_TYPE_ID | FIELD_NAME | FIELD_TYPE FieldValues --------------------------------------- ID | FIELD_ID | ITEM_ID | VALUE
我试图找出在Rails中处理这种设计的最佳方法。 我想要允许扩展简单属性的许多模型。
当我检索一个Item
我希望它包含已为该模型定义的加法字段值的哈希值。
就像是…?
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
或者,你可以改变
cfh[fv.field_definition] = fv
…至…
cfh[fv.field_definition.field_name] = fv.value
看看友好的ORM 。 它允许您在没有架构的情况下使用mysql。 它受到了这篇博文的启发,关于Friendfeed如何使用mysql存储无模式数据。
尽管您可以非常轻松地使用Friendly模型旁边的ActiveRecord模型,但Friendly会替换ActiveRecord。
如果您的目的是让您的FieldDefinition
记录属于不同的模型(例如,指向SqueekyToyItem
或BalloonItem
的列item_id
),那么您想要的是多态关联。
它基本上允许你有一个item_type
列(在你的item_id
列旁边),然后指定它指向的实际项目类型。
ActiveRecord :: Associations :: ClassMethods的文档中有一个标题“Polymorphic associations”。