0

在我的用户模型中,我有一个设置为序列化的引导字段。默认情况下,该字段为 nil,但计划是它稍后会像这样结束:

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

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

4

2 回答 2

1

为什么这不起作用?

user = User.find id

user.datastpeps[:guided_step3] = true
user.save
于 2012-04-23T00:11:51.633 回答
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模型中重新定义 writer 方法:

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 = {}不会清除哈希。因此,您需要平衡这种方法的利弊。

于 2012-04-23T01:46:55.813 回答