【问题标题】:Object doesn't update when I save保存时对象不更新
【发布时间】:2013-05-23 18:30:55
【问题描述】:

我可能遗漏了一些明显的东西,但是当我尝试保存一个对象时,它不会在数据库中更新。我可以插入对象。这是我的模型。我可以在用户模型上正确地做所有事情,我只是在争议模型上遇到了问题。

class Dispute < ActiveRecord::Base
  attr_accessible :reason
  belongs_to :user
end

class User < ActiveRecord::Base
  attr_accessible :name, :email
  has_many :disputes
end

然后我尝试...

d = Dispute.new
d.save  # This works, it is inserted correctly
  BEGIN
  INSERT
  COMMIT
d.reason = "This is a reason"
d.save  # This doesn't work
  BEGIN
  COMMIT
d.reason = "This is a different reason"
d.changed?
  true
d.save
  BEGIN
  COMMIT

不知道我错过了什么。我确实简化了一点。我在这个项目中有许多其他对象,它们都工作得很好。

d.update_attributes( :reason => "This is a reason" )

这也是同样的行为,它不更新数据库中的记录,但它返回 true。

【问题讨论】:

  • .save 也返回true?
  • d.reason = "This is a reason"d.save之后,做Dispute.find_by_reason('This is a reason')能找到记录吗?
  • @Dogbert - 是的,它确实返回 true。
  • @garbagecollection 当我进行搜索时,我得到 nil ,这是有道理的,因为它没有在数据库中更新。
  • @Karl,Dispute.new(reason: "...").save! 会发生什么?

标签: ruby-on-rails activerecord


【解决方案1】:

您是否检查过.valid? 是否因为验证而失败?

争议属于用户,该用户有很多争议。 您应该以始终与用户帐户相关联的方式创建争议。

你可以试试这个:

 u = User.first
 d = Dispute.new
 d.user = u
 d.save
 d.reason = "something"
 d.save
 d.persisted?
 d.valid?

然后你可以反过来尝试:

 u = User.first
 u.disputes.create(:reason => "something else")
 u.save

这也应该有效

【讨论】:

  • 如果您自己创建争议,而不是拥有/与用户关联,然后保存争议,我预计它会因为验证而失败。奇怪
  • 好吧,我照你说的做了。 u = User.first d = Dispute.new d.user = u d.save # 插入正确并与用户绑定 d.reason = "Something" d.save! # 表示保存正确,但没有更新数据库 d.persisted? # true d.valid? # 是的
  • 您是否无意中覆盖了 ActiveRecord::Base 中的某些内容?
  • 我正在使用 mysql。我不认为我是,但我会调查一下。谢谢。
  • 你有解决方案,我正在覆盖更新方法。感谢您的所有帮助。
【解决方案2】:

一般/未来参考:如果您查看开发服务器上的服务器日志,您将能够看到 d.save 失败的确切原因。只需在控制台中向上滚动,直到您看到尝试的 CRUD 操作失败。失败的原因应该在那里说明。

如果您仍然遇到此问题,您可以发布日志的输出吗?

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多