关于ruby on rails:ActiveRecord + Pry混乱

ActiveRecord + Pry confusion

这让我困惑不已。

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

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

撬杆输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[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框架和PostgresDB。

1
2
3
4
5
6
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_创建_daily_scores.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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的怪癖,但行为是相同的。


这是因为您使用模型属性在模型中调用了attr_accessor,它超越了Rails提供的默认访问器(访问器由updatenew方法调用)。请注意此文档,以备将来某一天要重写访问器时参考。

从您的模型中删除attr_accessor将起作用!