【问题标题】:With the serialize field, how to manage updates w/o replacing everything?使用 serializefield,如何在不替换所有内容的情况下管理更新?
【发布时间】:2012-05-03 15:15:51
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    如果您真的希望它是自动的,另一种方法是在您的 User 模型中重新定义 guided_steps 的 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 = {} 不会清除哈希。因此,您需要权衡这种方法的利弊。

    【讨论】:

      【解决方案2】:

      为什么这不起作用?

      user = User.find id
      
      user.datastpeps[:guided_step3] = true
      user.save
      

      【讨论】:

      • 这行得通,但是我需要对所有内容进行硬编码。我有兴趣使用 jQuery ajax 帖子来发布参数并让 rails 来做更新
      • 所以唯一的方法是 jquery 发送完整的哈希,而不仅仅是新的对,你必须依赖它,例如,如果同一个用户在同一时刻这样做了 2 次,那么事情将会是丢失,数据将不一致。
      猜你喜欢
      • 2014-01-01
      • 2017-11-22
      • 2013-01-29
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多