Ruby on rails 基于用户表单的动态活动记录存储访问器?

Ruby on rails 基于用户表单的动态活动记录存储访问器?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,活动记录存储允许您在单个单元格内序列化参数 即 这对我的应用程序非常有用,因为我每天都要创建许多表单,其中90%的表单是相同的(用户名、爱好、兴趣等),然后10%的表单是无模式的(这里是随机选项,另一个表单中是随机选项)。我也不需要按无模式选项排序 我所做的是,我为90%的表单字段创建了一个始终相同的表,然后我有另一个表,其中包含最后10%的字段(我有另一个表的原因是因为这是一个归属关系,所以用户可以在这个表中有许多行) ... 现在唯一的问题是,每次我在自定义表单中创建一个新字段时,我都必

活动记录存储允许您在单个单元格内序列化参数

这对我的应用程序非常有用,因为我每天都要创建许多表单,其中90%的表单是相同的(用户名、爱好、兴趣等),然后10%的表单是无模式的(这里是随机选项,另一个表单中是随机选项)。我也不需要按无模式选项排序

我所做的是,我为90%的表单字段创建了一个始终相同的表,然后我有另一个表,其中包含最后10%的字段(我有另一个表的原因是因为这是一个归属关系,所以用户可以在这个表中有许多行)


...
现在唯一的问题是,每次我在自定义表单中创建一个新字段时,我都必须将该参数添加到活动记录存储访问器中,否则会出现方法丢失错误。如果我可以为无模式字段创建尽可能多的视图表单,并且从不更新模型中的访问器,那就太好了

因此,我的问题是:是否可以将所有用户提交的自定义字段动态添加到访问者数组中,这样,如果用户提交了字段“some_random_option1221”、“other_option_here”,那么我就不必进入访问者数组并添加该字段了

谢谢

查看以下链接:


使用rails 4和postgresql,以下内容对我很有用。看起来只要稍加调整,rails 3存储方法也可以使用

对给定模型实例拥有的存储哈希中的每个字段键动态调用存储\访问器。如果用户模型的列名为options,类型为hstore,则可以访问options散列。(在rails 3中,您可以调用问题代码中的store方法,以使options方法工作。)

创建一个方法,以便在用户界面添加新字段时执行此操作。然后在初始化后调用此方法,以便从db加载用户将在加载时设置字段名访问器。您可能还希望在保存后调用此方法

class User < ActiveRecord::Base
  after_initialize :add_field_accessors
  after_save       :add_field_accessors

  def add_store_accessor field_name
    singleton_class.class_eval {store_accessor :options, field_name}
  end

  def add_field_accessors
    num_fields = options.try(:keys).try(:count) || 0
    options.keys.each {|field_name| add_store_accessor field_name} if num_fields > 0
  end
end
在Rails3中,您将调用attr\u访问器,而不是调用store\u访问器


请注意,您将无法调用User.new(:option_1=>'some_option_value'),因为用户类对象没有访问器方法(因为每个用户实例可以有不同的属性)。

太酷了,看起来像是
num_fields=options.try(:key)。try(:count)| 0
不需要,您可以添加默认值
{
切换到选项字段,因此options.keys只是一个空数组。
u = User.new
u.option2 = 'some option'
u.option2 # => 'some option'
<%= form_tag do %> 
  <%= #render partial form for an object that has non-changing fields %>
  ...
  <%= #render a schema-less partial form based off an ID passed here %>
<% end >
class User < ActiveRecord::Base
  after_initialize :add_field_accessors
  after_save       :add_field_accessors

  def add_store_accessor field_name
    singleton_class.class_eval {store_accessor :options, field_name}
  end

  def add_field_accessors
    num_fields = options.try(:keys).try(:count) || 0
    options.keys.each {|field_name| add_store_accessor field_name} if num_fields > 0
  end
end
def build_options
  @user.options = options_hash
  @user.add_field_accessors
end