使用序列化字段,如何管理更新无需更换所有内容?

时间:2012-04-23 00:05:30

标签: ruby-on-rails ruby-on-rails-3 activerecord serialization

在我的用户模型中,我有一个设置为序列化的引导字段。默认情况下,该字段为nil,但计划最终会以此结束:

{
guided_step1 : true,
guided_step1_decision : 33,
guided_step2 : true,
guided_step3 : false,
guided_step4 : false
}

我的问题是,如果我想发布到服务器param [:user] [:guided_step3] = true,那么最终会删除其他所有内容。如何发布并更新字段或插入字段?处理这个用例的正确方法是什么?感谢

2 个答案:

答案 0 :(得分:1)

为什么这不起作用?

user = User.find id

user.datastpeps[:guided_step3] = true
user.save

答案 1 :(得分:1)

我在这看到两种可能的方法。最简单的方法是在控制器中合并哈希值,而不是仅将它们发送到update_attributes

guided_steps = params[:user].delete(:guided_steps) || {}
@user.guided_steps = (@user.guided_steps || {}).merge(guided_steps)
@user.update_attributes(params[:user])

另一方面,如果你真的希望它是自动的,那就是在guided_steps模型中重新定义User的编写器方法:

class User < ActiveRecord::Base
  ...
  def guided_steps=(new_steps)
    gs = self.guided_steps || {}
    gs = gs.merge(new_steps || {})
    write_attribute(:guided_steps, gs)
  end
  ...
end

这应该是这样的,当您在控制器中调用@user.update_attributes(params[:user])时,新的guided_steps将与旧的guided_steps=合并。这种方法的一个潜在缺点是@user.guided_steps = {}将比以前更直观地工作。例如,{{1}}不会清除哈希值。因此,您需要平衡这种方法的优缺点。