2016-05-16 58 views
2

这让我感到困惑不已。ActiveRecord + Pry混淆

在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 

撬输出如下:

[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 

这到底是怎么回事?为什么不能访问我的变量属性?实际上是否保存了记录?

更新: 检查在控制台,行为是相同的,如果我只是创建一个新的对象。我使用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 

现在又增加了另一列日:日期 - 使用:日期,而不是:日期时间 - 检查它是否是一个怪癖:日期时间,但行为是一样的。

+0

如果你调用'@ ds.valid?' –

+0

[18] pry(main)> @ ds.valid,会发生什么? => true –

+0

更新前后是@ ds.changes == []吗? –

回答

0

这是因为你在你的模型称为attr_accessor与您的模型的属性,这推翻了由导轨提供的默认存取(访问器是由updatenew方法调用)。 Note this doc,仅供参考,如果你有一天想覆盖访问者。

从您的模型中删除attr_accessor将诀窍!