2013-05-31 63 views
1

在我的Rails項目中,我使用Postgresql。Rails update_attributes不適用於Postgresql

User.find_by_sql("update users set address = '#{params[:address]}' where id = #{current_user.id}") 

此代碼工作正常,但等效的ActiveRecord不工作:

user = User.find(current_user.id) 
    user.update_attributes(:address => params[:address]) 

它總是顯示在日誌Begin; Rollback。 你能解釋一下爲什麼會發生這種情況?有沒有與Postgres相關的問題? 我使用Rails 3.2

編輯

我發現在那裏我錯了...驗證失敗是造成這一點。 解決方法是:

user.update_column(:address,params[:address]) 

這將繞過驗證。 謝謝你們的幫助。

+0

你能告訴你的用戶模型嗎? – edralph

回答

5

update_attributes更新,如果所有的驗證傳遞的記錄,您的驗證必須失敗,請使用user.errors找出錯誤

user = User.find(current_user.id) 
    user.update_attributes(:address => params[:address]) 
    puts user.errors 

爲了這麼一個節省單列使用update_attribute

user.update_attribute(:address, params[:address]) 
+0

謝謝,我的驗證失敗.... 有什麼辦法可以跳過驗證? 。 ,因爲我只需要保存1列而無需驗證。 – sunny1304

+0

嘗試'user.update_attribute(:address,params [:address])'或'User.update_all(「address =#{params [:address]}」,「id =#{user.id}」)' – Salil

+1

You可以做'user.address = params [:address]',然後'user.save(:validate => false)'來跳過驗證 –

1

檢查故障:

user.update_attributes!(...) 
+1

update_attributes保存記錄本身,據我所知。 – sunny1304

+0

對不起,您是對的,任何驗證,可能會失敗? –

+0

這對於在控制檯上輸出更新失敗的原因很有用。 –

2

如果您在模型中使用attr_accessible但不包括:地址,則update_attributes將顯示工作,但記錄不會保存。

相關問題