代码之家  ›  专栏  ›  技术社区  ›  Ben Scheirman

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

  •  7
  • Ben Scheirman  · 技术社区  · 14 年前

    你知道一些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 我希望它包括为该模型定义的添加字段值的散列。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Mike Tunnicliffe    14 年前

    像……?

    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
    
        2
  •  1
  •   user94154    14 年前

    看看 Friendly ORM . 它允许您在没有模式的情况下使用MySQL。它的灵感来自于这个 blog post 关于FriendFeed如何使用MySQL存储无模式数据。

    友好型将取代ActiveRecord,尽管您可以很容易地使用友好型旁边的ActiveRecord模型。

        3
  •  1
  •   Stéphan Kochen    14 年前

    如果你的目的是 FieldDefinition 属于的记录 不同的 模型(例如,列 item_id 指的是 SqueekyToyItem 或A BalloonItem )那么你想要的是多态关联。

    它基本上允许你 item_type 列(在 项目编号 列),然后指定它指向的项的实际类型。

    文档中有一个标题“多态关联” ActiveRecord::Associations::ClassMethods .