如何更改模型中的属性值?

时间:2009-12-30 15:25:19

标签: ruby-on-rails ruby

我有以下脚本

ActiveRecord::Base.establish_connection(:adapter => 'mysql', :database => 'development', :username => 'appAccount', :password => '------', :socket => '/tmp/mysql.sock')

class ProcessQueue < ActiveRecord::Base
end

我正在使用的教程声称以下内容应该可行。

updateQ = ProcessQueue.find(:all, :conditions => "photoID = '234'")
updateQ.ExIfQ = 1
updateQ.save

updateQ具有以下数据

ProcessQueue id: 104, photoID: 234, ExIfQ: 0, Providor: 0, created_at: "2009-12-30 14:42:01", updated_at: "2009-12-30 14:42:01"

但是当运行updateQ.ExIfQ = 1时,我收到一条错误消息,说明该方法不存在

NoMethodError:未定义的方法'ExIfQ=' for #<Array:0x102207c60>

错误是有道理的。我正在尝试对阵列进行更改。因此,我只能假设我错了或教程错了:)

我想知道是否有人可以告诉我应该如何进行此更新?

p.s这是在我的rails应用程序中运行的后台脚本。

由于

3 个答案:

答案 0 :(得分:2)

有一些方法可以解决这个问题,每个方法都有各种各样的怪癖。

快速而脏的方法是使用update_all重新分配属性:

ProcessQueue.update_all('ExIfQ=1', :photoID => 234)

迭代使用find找到的所有内容:

ProcessQueue.find(:all, :conditions => { :photoID => 234 }).each do |pq|
  pq.ExIfQ = 1
  pq.save!
end

找到一个并直接操纵它:

if (pq = ProcessQueue.find_by_photoID(234))
  pq.ExIfQ = 1
  pq.save!
end

作为一个注释,尽量不要在使用带占位符或散列样式的数组声明它们时说明你的条件。它会更安全,因为它会根据需要为您进行类型转换。

答案 1 :(得分:1)

如果只有其中一个是查询结果,请使用:

updateQ = ProcessQueue.find(:first, :conditions => "photoID = '234'")

答案 2 :(得分:1)

find方法返回对象数组。

您可以添加first

updateQ = ProcessQueue.find(:all, :conditions => "photoID = '234'").first

然后您的示例将工作,或迭代数组

updateQ = ProcessQueue.find(:all, :conditions => "photoID = '234'")
updateQ.each do |u|
  up.ExIfQ = 1
  up.save
end