2009-10-17 52 views
7

有谁知道允许用户添加字段到模型的宝石或好的实现?用户在Rails中指定的动态模型字段

Ex。

用户想要将“内部注释”字段添加到联系人模型中。在接口方面,他们干脆就选择“新领域”>“类型:文本”

感谢

回答

6

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

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

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 

您将需要添加一个正则表达式,如果你想与属性=方法添加虚拟属性(检测的“=”的存在,做一个更新,而不是只得到的值)。 但你已经有了这个想法。

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

所以,你可以出现以下所有字段的列表:

Contact.find(:first).dynamic_fields 

和检索特定的一个具有以下内容:

Contact.find(:first).my_dynamic_field 
2

这里做的另一种方式。

免责声明:此方法不建议,因为它可能会被滥用。实际上,它应该只适用于您网站的管理员。

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