无法使用ActiveRecord更新属性。

9 浏览
0 Comments

无法使用ActiveRecord更新属性。

我想用ActiveRecord交换answers表中的内容。
\n代码1:\n

Archieve::Answer.find_each do |answer|
  str = answer.content
  dosomething() #改变值
  answer.update_attribute(:content,str)
end

\n但是它没有改变内容的值。\n代码2:\n

Archieve::Answer.find_each do |answer|
  str = answer.content
  dosomething() #改变值
  answer.reload
  answer.update_attributes(
    :content => str
  )
end

\n在更新:content属性之前,我每次都要reload记录。
\n这确实可以改变值。
\n为什么?
\ncode 1code 2之间有什么区别?
\n源代码\n

###1 Post Debug Message:
Updated Post:
Changed?: false 
valid?: true 
errors: # 
errors: #, @messages={}>

0
0 Comments

在这个问题中,出现了无法使用ActiveRecord更新属性的问题。可能的原因是在使用独立脚本时(而不是使用rails runner),OP在脚本中使用了require "active_record"。在之前的ActiveRecord版本中,例如2.x,这样做是可行的,但在Rails 3.1中可能是由于新的依赖引起的回归。也有可能是在独立初始化时,缺少依赖或者出现了AR 3.1.1的问题。

实际上,这可能是一个bug。使用update_attribute()可能会触发属性的脏检查bug,导致错误地认为对象没有改变,因此不会持久化,尽管update_attribute()的实现调用了save()。旧版本的Mongoid中也出现过类似的情况,可能你的ActiveRecord版本中也有类似的隐藏bug。

在Rails控制台中,可以通过对update_attribute进行修补来解决问题。然后再次运行Code 1,如果返回false,尽管你改变了属性,说明你的ActiveRecord版本有一个bug,应该报告给开发者。

在Code 1中,需要检查update_attribute()的定义。同时还需要注意一些事项,比如定义了哪些属性可以访问,通过attr_accessible定义,以及使用了哪些验证。只有可访问的属性才能通过update_attributes()进行更新,且在调用update_attribute时,验证是否通过。

总结起来,问题的原因可能是由于ActiveRecord版本的bug,解决方法是修补update_attribute并报告给开发者。此外,还需要确保定义了可访问的属性,并且验证通过。

文章链接:https://raw.github.com/Zhengquan/Swap_Chars/master/lib/orm.rb

0