【问题标题】:Ruby on Rails Triggers Update on Serialized Attribute Every TimeRuby on Rails 每次都会触发序列化属性的更新
【发布时间】:2011-10-20 20:02:23
【问题描述】:

我有一个带有名称和设置的简单用户模型。每次保存用户 AREL 后,都会对设置列执行更新。例如:

user = User.find_by_name('kevin')
user.save

(0.3ms)  UPDATE "users" SET "updated_at" = '2011-10-20 19:58:06.363541', "settings" = '--- {}' WHERE "users"."id" = 1

调用 save 时不会更新其他字段。这是预期的行为吗?为什么要执行更新?如果序列化的内容没有改变,是否可以关闭不改变?我已经上传了用于创建最小案例的示例项目:

http://cl.ly/0p0j3Z3Y0L1x1I1p3Z0g

【问题讨论】:

  • 如果在上面第一行之后立即调用user.changes,它的输出是什么?如果您为属性指定一个类怎么办,例如serialize :settings, Hash?
  • @Jordan 指定 Hash 没有帮助。 User.changes 返回一个空的哈希值。

标签: ruby-on-rails ruby


【解决方案1】:

这是预期的行为。在序列化属性中检测更改非常困难,因此每次保存时都会更新它们。

考虑以下(ruby 1.8.7)irb 会话:

ruby-1.8.7-p352 :001 > x = "--- \n:b: 2\n:a: 1\n"
 => "--- \n:b: 2\n:a: 1\n" 
ruby-1.8.7-p352 :002 > y = "--- \n:a: 1\n:b: 2\n"
 => "--- \n:a: 1\n:b: 2\n" 
ruby-1.8.7-p352 :003 > x == y
 => false 
ruby-1.8.7-p352 :004 > YAML.load(x) == YAML.load(y)
 => true

【讨论】:

  • 为什么? u.settings_was和u.settings序列化后不能进行字符串比较吗?
  • .. 更新了答案。此外,Dirty 模块希望 ActiveRecord 在属性更改时调用特定方法,以便收到有关更改的通知。例如,就地更改哈希值的过程非常困难。
猜你喜欢
  • 2014-04-14
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多