2013-05-31 62 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将显示工作,但记录不会保存。

相关问题