gpt4 book ai didi

mysql - 无法使用 ActiveRecord 更新属性

转载 作者:太空宇宙 更新时间:2023-11-03 16:56:27 26 4
gpt4 key购买 nike

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

Archieve::Answer.find_each do |answer|
str = answer.content
dosomething() #change the value
answer.update_attribute(:content,str)
end

但它不会改变内容的值(value)。

代码 2:

Archieve::Answer.find_each do |answer|
str = answer.content
dosomething() #change the value
answer.reload
answer.update_attributes(
:content => str
)
end

在更新:content属性之前,我每次都reload记录。
它确实可以改变值(value)。
为什么?
代码 1代码 2 有什么区别?
Source Code

###1 Post Debug Message:
Updated Post:

Changed?: false
valid?: true
errors: #<ActiveModel::Errors:0xa687568>
errors: #<ActiveModel::Errors:0xa687568 @base=#<Archieve::Answer id: 9997190932758339, user_id: 4163690810052834, question_id: 3393286738785869, content: "狗狗生病,好可怜呀,", is_correct: false, votes_count: 0, comments_count: 0, created_at: "2011-11-06 18:38:53", updated_at: "2011-11-06 18:38:53">, @messages={}>

最佳答案

可能存在 ActiveRecord 3.1.1 错误

OP 向我提到他在独立脚本中使用 require "active_record"(不使用 rails runner)。他的任务没有单独的 Rails 应用程序,他只使用脚本。这不一定是坏事,并且在早期的 ActiveRecord 版本中有效,例如2.x AFAIK——也许这是 Rails 3.1 中由于新的依赖关系而出现的回归?

# the OP's require statements:
require 'rubygems'
require 'logger'
require 'yaml'
require 'uuidtools'
require 'active_record'

完整代码在这里:https://raw.github.com/Zhengquan/Swap_Chars/master/lib/orm.rb

可能缺少依赖项,或者单独初始化时 AR 3.1.1 有问题?

这实际上可能是一个错误

可能是 update_attribute() 触发了属性脏跟踪中的错误,然后错误地假定对象没有更改,因此它不会被持久化,尽管update_attribute() 的实现调用 save()(请参阅下面的代码片段)。

我在旧版本的 Mongoid 中看到过类似的情况——可能是因为 update_attribute()

的 ActiveRecord 版本中存在类似的隐藏错误

在 Rails 控制台中,monkey-patch update_attribute 是这样的:

class ActiveRecord::Base
def update_attribute(name, value) # make sure you use the exact code of your Rails Version here
send(name.to_s + '=', value)
puts "Changed?: #{changed?}" # this produced false in the OP's scenario
puts "valid?: #{valid?}"
puts "errors: #{errors.inspect}"
save
end
end

然后尝试再次运行您的代码 1...

你不应该看到“Changed?: false”..如果它返回 false,尽管你改变了属性,那么你的 ActiveRecord 版本中有一个错误,你应该报告它。

代码 1:

注意:在此处检查 update_attribute()(单数)的定义:(请阅读有关验证的细则——使用该方法听起来不是个好主意)

http://ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000400

另见:

Rails: update_attribute vs update_attributes

update_attribute() 的源代码如下所示:

2260:       def update_attribute(name, value)
2261: send(name.to_s + '=', value)
2262: save
2263: end

如果属性的脏跟踪存在错误,它可能会失败...

代码 2:

第二个代码看起来是正确的。

还有一些事情需要考虑:

1) 您通过 attr_accessible 将哪些属性定义为可访问?

例如只有可访问的属性将通过 update_attributes() 更新

http://apidock.com/rails/ActiveRecord/Base/update_attributes

2) 您使用哪些验证?

您确定调用 update_attribute 时记录的验证通过了吗?

另见:

http://guides.rubyonrails.org/active_record_querying.html

http://m.onkey.org/active-record-query-interface

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

关于mysql - 无法使用 ActiveRecord 更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com