ActiveRecord + Pry 混乱

Posted

技术标签:

【中文标题】ActiveRecord + Pry 混乱【英文标题】:ActiveRecord + Pry confusion 【发布时间】:2016-09-12 07:38:38 【问题描述】:

这让我很困惑。

在 rake 任务中,我使用以下代码在 DailyScore 模型上保存新记录:

def save_record_as_daily_score_object(data)
    @ds = DailyScore.where(date: data[:date]).first_or_create!  
    @ds.update!(data)
    binding.pry
end

pry 输出如下:

[10] pry(main)> data
=> :date=>"2015-09-02",
:mail=>-0.6,
:times=>-7.1,
:telegraph=>-2.2,
:guardian=>-4.0,
:express=>-0.1,
:independent=>-3.2,
:average=>-3.4  

[11] pry(main)> @ds
=> #<DailyScore:0x000001098121a8
 id: 4975,
 mail: nil,
 telegraph: nil,
 times: nil,
 average: nil,
 guardian: nil,
 independent: nil,
 express: nil,
 date: nil,
 created_at: 2016-05-16 13:10:03 UTC,
 updated_at: 2016-05-16 13:10:03 UTC>

 [12] pry(main)> @ds.average
 => -3.4
 [13] pry(main)> @ds.date
  => "2015-09-02"
 [14] pry(main)> @ds.persisted?
  => true
 [15] pry(main)> DailyScore.last
=> #<DailyScore:0x000001086810d8
 id: 4975,
 mail: nil,
 telegraph: nil,
 times: nil,
 average: nil,
 guardian: nil,
 independent: nil,
 express: nil,
 date: nil,
 created_at: 2016-05-16 13:10:03 UTC,
 updated_at: 2016-05-16 13:10:03 UTC>
 [16] pry(main)> DailyScore.last.average
=> nil

这里发生了什么?为什么不能 Pry 访问我的变量属性?记录是否真的被保存了?

更新: 检查控制台,如果我只是创建一个新对象,行为是相同的。我正在使用 Padrino 框架和 Postgres 数据库。

2.0.0 :001 > ds = DailyScore.new(date:"2016-01-01")
 => #<DailyScore id: nil, mail: nil, telegraph: nil, times: nil, average: nil, guardian: nil, independent: nil, express: nil, date: nil, created_at: nil, updated_at: nil>
2.0.0 :002 > ds.date
 => "2016-01-01"
2.0.0 :003 > ds
 => #<DailyScore id: nil, mail: nil, telegraph: nil, times: nil, average: nil, guardian: nil, independent: nil, express: nil, date: nil, created_at: nil, updated_at: nil>

是不是模型有问题?这是原始迁移:

006_create_daily_scores.rb

class CreateDailyScores < ActiveRecord::Migration
   def self.up
     create_table :daily_scores do |t|
       t.float :average
       t.datetime :date
       t.float :express
       t.float :independent
       t.float :guardian
       t.float :telegraph
       t.float :mail
       t.float :times
       t.timestamps
     end
   end

   def self.down
     drop_table :daily_scores
   end
 end

现在添加了另一列 day:date - 使用 :date 而不是 :datetime - 检查它是否是 :datetime 的怪癖,但行为是相同的。

【问题讨论】:

如果你打电话给@ds.valid?会发生什么 [18] pry(main)> @ds.valid? => 是的 更新前后是@ds.changes == [] 吗? 不使用first_or_create!会怎样? 你有没有在你的模型中定义attr_accessor?如果是这样,您应该删除它,因为它会覆盖属性。 【参考方案1】:

发生这种情况是因为您在模型中使用模型属性调用了 attr_accessor,这覆盖了 Rails 提供的默认访问器(访问器由 updatenew 方法调用)。 Note this doc,供参考,如果您确实希望有一天覆盖访问器。

从您的模型中删除 attr_accessor 即可解决问题!

【讨论】:

以上是关于ActiveRecord + Pry 混乱的主要内容,如果未能解决你的问题,请参考以下文章

为 ActiveMerchant CreditCard 对象实现 find()、save() ActiveRecord 方法

javascript控制台的`binding.pry`?

Puma Rails 5 binding.pry仅在超时前60秒可用

pry与ruby版本冲突

如何使用 pry 调试器检查 rspec 变量

没有为 binding.pry 提供 REPL 的护栏