2009-12-30 66 views
0

我有以下腳本如何更改模型中的屬性值?

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應用程序中的後臺腳本。

由於

+0

我不完全明白你想要做什麼。 ProcessQueue.find(:all,...)返回一個ProcessQueue對象數組,因此如果不首先從數組中提取對象,則無法設置對象屬性並保存。 – 2009-12-30 15:34:01

回答

2

有幾個方法可供選擇的工作,各自有各自不同的怪癖。

的快速和骯髒的方法是使用update_all重新分配屬性:在所有那些使用find發現

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

迭代:

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

如果僅存在將是這些是查詢結果之一,使用:

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

我不明白倒票。在OP代碼中,如果您替換爲:全部爲:首先,如本答案中所述,代碼將起作用。 – nathanvda 2009-12-31 10:59:45

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