2016-05-16 10 views
2

Dies ist verwirrend mich kein Ende.ActiveRecord + Pry Verwirrung

In einer Harke Aufgabe, ich speichere neue Datensätze auf dem DailyScore Modell mit dem folgenden Code:

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

Die hebeln Ausgabe lautet wie folgt:

[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 

Was ist hier los? Warum kann Pry nicht auf meine Variablenattribute zugreifen? Und wird die Aufzeichnung tatsächlich gespeichert oder nicht?

UPDATE: Einchecken in der Konsole, das Verhalten ist das gleiche, wenn ich einfach ein neues Objekt erstellen. Ich benutze das Padrino-Framework und eine Postgres-Datenbank.

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> 

Ist es ein Problem mit dem Modell? Hier ist die ursprüngliche Migration:

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 

Habe jetzt hinzugefügt eine weitere Spalte Tag: Datum - mit: Datum statt: Datumzeit - zu überprüfen, ob es sich um eine Marotte mit war: Datetime, aber Verhalten ist dasselbe.

+0

Was passiert, wenn Sie '@ ds.valid? Aufrufen?' –

+0

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

+0

Ist @ ds.changes == [] vor und nach dem Update? –

Antwort

0

Das passiert, weil Sie attr_accessor in Ihrem Modell mit Ihren Modellattributen aufgerufen haben, die die von Rails bereitgestellten Standardzugriffsobjekte überschreiben (die Accessoren werden von update und new Methoden aufgerufen). Note this doc, als Referenz, wenn Sie tun Accessoren eines Tages überschreiben möchten.

Entfernen attr_accessor von Ihrem Modell wird den Trick tun!