【发布时间】: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