【问题标题】:Rails console save not saving and is selecting from related table insteadRails 控制台保存不保存,而是从相关表中选择
【发布时间】:2015-06-18 18:09:25
【问题描述】:

在 Rails 控制台中测试一些东西时,我注意到当我调用记录并尝试保存它时发生了这种奇怪的事情。

2.1.5 :026 > p = WorkOrder.first
WorkOrder Load (0.4ms)  SELECT  `work_orders`.* FROM `work_orders`   ORDER BY `work_orders`.`id` ASC LIMIT 1
=> #<WorkOrder id: 3, client_id: 4, created_at: "2015-06-17 17:12:07", updated_at: "2015-06-17 17:12:07", dueDate: "2015-07-17", number: "0221506-003", project_type_id: 2, monthlySequenceNumber: "003", projectDescription: "Project", status_id: 1, labels_id: nil> 
2.1.5 :027 > p.save
(0.2ms)  BEGIN
ProjectType Load (0.5ms)  SELECT  `project_types`.* FROM `project_types`  WHERE `project_types`.`id` = 2 LIMIT 1
(0.1ms)  COMMIT
=> true 

为什么它似乎是在关联对象上执行选择?此外,记录也没有提交回数据库。我错过了什么导致它以这种看似奇怪的方式表现?

编辑: 促使我开始尝试保存从数据库中提取的记录的原因是我在执行类似

的操作时遇到了相同的问题
p.delete

然后

p.save

这将返回 true,但只会在项目类型上执行那个奇怪的选择

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    为什么它似乎是在关联对象上执行选择?

    这可能是由 WorkOrder 模型中的验证代码或回调引起的。

    记录也没有被提交回数据库。我错过了什么导致它以这种看似奇怪的方式表现?

    您尚未修改记录,因此我期望更新的唯一字段是updated_at。可以禁用 ActiveRecord 的时间戳功能。你这样做了吗? (参考Is there a way to avoid automatically updating Rails timestamp fields?

    更新

    当我测试p.delete 后跟p.save 时发生同样的事情,结果是true。这可能是一个错误,但我还没有对其进行足够的研究来确定它。

    在快速查看 ActiveRecord 源代码后,我认为会发生什么,因为您首先删除了记录 (p),数据库中有 0 行匹配该记录的 id (@987654328 @)。这意味着当您运行p.save 时,0 行得到更新(更新而不是插入,因为记录被认为是持久的)。该行数与false here 进行比较,因此0 != false 返回true

    【讨论】:

    • 我想我选择了一个不好的例子,但同时发生的事情是我会做类似 p.delete 的事情,它将它从数据库中删除,但是 p.save 不会把它放回去即使它返回true。它只会像我的示例中那样在关联表上执行选择。可以这么说,我的验证中的某些内容是否可能导致它“短路”?
    • 啊,这是奇怪的行为。我对这个问题进行了更深入的研究。有关详细信息,请参阅我的更新答案。
    • 因此,如果我正确阅读了您的链接,rails 会确定我的记录是持久的,因此会尝试更新不存在的记录?我最终能够通过相当迂回的 WorkOrder.create(p.attributes) 将记录重新插入,但这似乎有点愚蠢。虽然我认为删除和取消删除记录的想法一开始有点愚蠢。删除 p.persisted 后也在相关说明中?返回 false,我很确定这是预期的。
    • 是的,我想就是这样。我应该说“认为不是新记录”而不是“认为是持久的”。在x.destroy 之后都坚持了?和新记录?返回假。 x.persisted? #=&gt; false, x.new_record? #=&gt; false
    【解决方案2】:

    由于您没有更改任何属性,请尝试使用p.touch 而不是p.save。无论如何,这应该保存记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2017-05-03
      相关资源
      最近更新 更多