2016-05-16 9 views
2

Это меня не смущает.ActiveRecord + Pry confusion

В задаче грабли, я коплю новые записи на модели 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 

ли добавили еще один столбец день: дата - с помощью: дата вместо: DateTime - проверить, если это был бзик с: DATETIME, но поведение та же.

+0

Что произойдет, если вы вызываете '@ ds.valid? ' –

+0

[18] pry (main)> @ ds.valid? => true –

+0

Является ли @ ds.changes == [] до и после обновления? –

ответ

0

Это происходит потому, что вы вызвали attr_accessor в своей модели с вашими атрибутами модели, которые переопределяют устройства доступа по умолчанию, предоставляемые Rails (аксессоры вызываются по методам update и new). Note this doc, для справки, если вы do хотите переопределить аксессуры в один прекрасный день.

Снятие attr_accessor с вашей модели сделает трюк!