我在这里看到了两种潜在的方法。最简单的方法是在控制器中合并散列,而不是仅仅将它们发送到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 = {}
不会清除哈希。因此,您需要平衡这种方法的利弊。