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记录属于不同的模型(例如,指向SqueekyToyItemBalloonItem的列item_id ),那么您想要的是多态关联。

它基本上允许你有一个item_type列(在你的item_id列旁边),然后指定它指向的实际项目类型。

ActiveRecord :: Associations :: ClassMethods的文档中有一个标题“Polymorphic associations”。