2012-05-30 76 views
1

我試圖更新數據庫中的記錄使用Object.update_attributes(:field => "parameter") 爲了顯示我想要做的是一個簡單的例子。請參考下面未定義的方法`update_attribute'爲ActiveRecord ::關係

a = params["ORDERNO"].to_s 
b = params["TRACKNO"].to_s  
@bd=Staging.where(:trackno => b , :orderno=> a) 
    if @bd.nil? 
     puts "not found" 
    else 
     @bd.update_attributes(:field_name => "PARAMETER") 
    end 

我也試過@bd.first.update_attributes(::field_name => "PARAMETER")

回答

7

使用update_all(:field_name => "PARAMETER")

+0

這是正確的答案。給定'User.where(login:'admin').update_all locked_at:nil',AR生成'UPDATE users SET users.locked_at = NULL WHERE users.login ='admin''。這可以讓數據庫在不實例化過多Ruby對象的情況下處理業務。 – Phlip

3

如果你知道,世界上只有一個分期correpsponding到(trackno,orderno一個可能的解決方案的代碼) 你可以嘗試類似這樣的

@bd =Staging.find_by_trackno_and_orderno(b,a) 
if @bd 
    @bd.update_attributes(:field_name => value) 
else 
    #whatever you want to do 
end 
2

您的查詢@bd=Staging.where(:trackno => b , :orderno=> a)返回一個對象數組。

Array通常沒有#update_attributes方法。因此,您需要重寫查詢以僅提取1個對象或使用每個對象遍歷查詢結果中的所有對象:@bd.each{|r| r.update_attributes(:field_name => "PARAMETER")}

但迭代不是更新許多記錄的正確方法,因爲它會調用每個記錄的更新查詢你想要更新的對象。

+0

這是不正確的,因爲'where()'返回一個基於'ActiveRecord :: Relation'的對象,用於進一步的構建器方法。如'update_all' ... – Phlip

相關問題