【问题标题】:Rails update_attributes not working for PostgresqlRails update_attributes 不适用于 Postgresql
【发布时间】:2013-05-31 12:21:28
【问题描述】:

在我的 Rails 项目中,我使用的是 Postgresql。

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

这段代码工作正常,但等效的活动记录不工作:

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

它总是在日志中显示Begin; Rollback。 你能解释一下为什么会这样吗?是否有与 Postgres 相关的任何问题? 我正在使用 Rails 3.2

编辑

我发现我错了......验证失败导致了这种情况。 解决办法是:

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

这将绕过验证。 谢谢大家的帮助。

【问题讨论】:

  • 你能展示一下你的用户模型吗?

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2


【解决方案1】:

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])

【讨论】:

  • 谢谢,我的验证失败....有什么办法可以跳过验证?? .因为我只需要保存 1 列而无需验证。
  • 试试user.update_attribute(:address, params[:address])User.update_all("address = #{params[:address]}", "id = #{user.id}")
  • 你可以先user.address = params[:address] 然后user.save(:validate => false) 跳过验证
  • @AmitThawait:- 我同意阿米特
  • user.errors.full_messages 会更有用,因为user.errors 只会返回ActiveModel::Errors 实例而不是错误消息。 :)
【解决方案2】:

检查失败:

user.update_attributes!(...)

【讨论】:

  • 这对于在控制台上输出更新失败的原因很有用。
【解决方案3】:

如果您在模型中使用 attr_accessible 但不包括 :address,update_attributes 似乎可以工作,但记录不会保存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多