用户在Rails中指定了动态模型字段

时间:2009-10-17 17:07:22

标签: ruby-on-rails activerecord

是否有人知道某个宝石或允许用户向模型添加字段的良好实现?

实施例

用户希望在联系人模型中添加“内部注释”字段。在界面中,他们只需选择“新字段”> “类型:文字”

由于

2 个答案:

答案 0 :(得分:6)

对不起,我不知道有任何插件可以做到这一点。但我有一个实施建议。

这个想法是添加一个“DynamicField”模型,它与Contact模型有一个has_many关系。 当您在Contact模型中缺少某个方法时,如果是这种情况,您可以检查是否有动态字段来检索它。

class DynamicField < ActiveRecord::Base
    belongs_to :contact
end


class Contact < ActiveRecord::Base
    has_many :dynamic_fields

    def method_missing(sym, *args, &block)
        begin
            super
        rescue
            field = dynamic_fields.find_by_name(sym)
        end
        raise ActiveRecord::NoMethodError if field.nil?
        field.value
    end
end

如果要使用attribute =方法添加虚拟属性(检测存在“=”并执行更新而不是仅获取值),则需要添加正则表达式。 但是你已经有了这个想法。

当该方法不存在时,我们检查动态字段是否存在具有相同名称的字段。 如果没有(field.nil?),我们引发NoMethodError。否则,我们将其退回。

因此,您可以使用以下内容获取所有字段的列表:

Contact.find(:first).dynamic_fields

使用以下内容检索特定的一个:

Contact.find(:first).my_dynamic_field

答案 1 :(得分:2)

这是另一种方法。

免责声明:不建议使用此方法,因为它可能会被滥用。实际上,只有您网站的管理员才能访问它。

class MyModel < ActiveRecord::Base
  ...
  def self.add_column(name, type, args= {})
    ActiveRecord::Migration.add_column table_name, name, type, args
  end
end