【问题标题】:Rails ActiveRecord#create won't save to databaseRails ActiveRecord#create 不会保存到数据库
【发布时间】:2015-06-26 03:46:37
【问题描述】:

我在将 ActiveRecord 保存到我的 postgres 数据库时遇到问题。当我在 pry(控制台调试器)中的类上运行 #create 命令时,我得到了一个新创建的类实例,它会自动增加 ID。但是,它不在数据库中。尽管将所有 postgres 日志设置调整为尽可能详细,但不会在 postgres 日志中引发错误。如果#create 验证失败,我将在 postgres 日志中看到错误。但是,成功的#create 语句根本不会保存到数据库中。我在 Mac 上并通过 brew 安装了 postgres。

对可能发生的事情有任何想法吗?这让我发疯了,我整个早上都在做这件事。

更新 #1:我没有使用 database_cleaner 或类似的东西。

更新 #2:我的 pry 控制台没有显示任何 SQL,通过或失败。这是它的样子:

[26] pry(#<RSpec::ExampleGroups::Tweet>)> Tweet.create({tweet_id: rand(111111111111111111..999999999999999999), author: 'adfsadfs', tweet: 'adfadfs', retweet_count: 3, latitude: 87.684, longitude: 41.364, tweet_created_at: Time.now})
=> #<Tweet:0x007fb408f2f210
 id: 64,
 tweet_id: 855873080844717219,
 author: "adfsadfs",
 tweet: "adfadfs",
 retweet_count: 3,
 latitude: #<BigDecimal:7fb408f2e2c0,'0.87684E2',18(45)>,
 longitude: #<BigDecimal:7fb408f2df78,'0.41364E2',18(45)>,
 created_at: Thu, 25 Jun 2015 14:08:33 CDT -05:00,
 updated_at: Thu, 25 Jun 2015 14:08:33 CDT -05:00,
 tweet_created_at: Thu, 25 Jun 2015 14:08:33 CDT -05:00>

更新 #3:我在 rspec 测试中运行 pry。我的整个 rspec 文件如下所示:

require 'rails_helper'
RSpec.describe Tweet, type: :model do
  it { binding.pry }
  pending
end

已解决:问题是当 rspec 测试被提前取消或标记为挂起时,记录不会存储在数据库中。

【问题讨论】:

  • 控制台应该输出它正在执行的 SQL。总的来说,控制台的输出会很有帮助。
  • 您以后可以通过find 检索该对象吗?它得到id,如果保存失败,它不应该。
  • 为回溯执行create!
  • ... 然后在 database.yml 文件中查看详细信息,并确保您处于您认为的环境中。如果你在测试中,你可能会回滚。
  • Per I in ACID,这意味着隔离,您将不会检测到与任何外部客户端的未提交事务的任何更改。也就是说,如果您的测试环境在一个最终回滚的巨型事务中运行所有测试。

标签: ruby-on-rails postgresql ruby-on-rails-4


【解决方案1】:

在 PostgreSQL 中有 transaction 这样的东西,它带有 ACID 保证。一旦你进行交易,你就几乎是“在你自己的世界里”。你只有你可以进行更改并看到它们被应用,其他观察者不会看到这些更改。

为了让其他人看到您应用了哪些更改,事务必须提交,否则所有更改都将丢失。如果应用程序决定发出ROLLBACK,如发生故障(验证、异常等),这些更改将丢失。如果连接断开,这些更改将丢失。如果进程终止,这些更改将丢失。

测试套件通常在一个巨大的事务中运行。 测试套件完成后,会发出ROLLBACK,并且数据库会与运行测试之前的状态相同。这样,测试运行不会在数据库数据中留下任何痕迹:代码可能已损坏和/或损坏,这可能会影响进一步的测试运行。为了发生这种情况,测试套件在事务中运行。缺点:无法从外部观察到变化。

pry 会话中,使用 ActiveRecord 的方法。由于它在进行交易的连接上运行,因此它能够看到建立到那个时刻的状态。

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多