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

Вывод 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

Теперь добавили еще один столбец день: дата - используя: дату вместо: дату и время - чтобы проверить, не было ли это причудой с: дата и время, но поведение такое же.


person Jonathan_W    schedule 16.05.2016    source источник
comment
Что произойдет, если вы позвоните @ds.valid?   -  person Anthony E    schedule 16.05.2016
comment
[18] pry(main)› @ds.valid? =› правда   -  person Jonathan_W    schedule 16.05.2016
comment
Является ли @ds.changes == [] до и после обновления?   -  person Anthony E    schedule 16.05.2016
comment
pry(main)› @ds.changes =› {} — как до, так и после обновления! вызов   -  person Jonathan_W    schedule 16.05.2016
comment
Хм... Очень странно, это относится к Праю?   -  person Anthony E    schedule 16.05.2016
comment
Точно сказать не могу. Как еще посоветуете проверить?   -  person Jonathan_W    schedule 16.05.2016
comment
Давайте продолжим обсуждение в чате.   -  person Jonathan_W    schedule 16.05.2016
comment
Что произойдет, если вы не используете first_or_create!?   -  person Petr Gazarov    schedule 16.05.2016
comment
@PetrGazarov Это хороший момент. first_or_create не является потокобезопасным.   -  person Anthony E    schedule 16.05.2016
comment
Можешь попробовать @ds.reload!   -  person ruby_newbie    schedule 16.05.2016
comment
Где именно определен метод save_record_as_daily_score_object? В рейк-файле? В модели? Я не наблюдаю такого поведения под рельсами, если метод находится в модели или в грабли. Но, судя по тегам, ваш сценарий может быть более сложным?   -  person BoraMa    schedule 16.05.2016
comment
@BoraMa хорошая мысль, попробуем переместить его, чтобы разгребать себя.   -  person Jonathan_W    schedule 17.05.2016
comment
Объект save_record_as_daily_score_object перенесен в tasks.rake и изменен first_or_create! для find_or_create_by, но все равно такое же поведение. @PetrGazarov, не могли бы вы предложить другую замену для first_or_create! ?   -  person Jonathan_W    schedule 17.05.2016
comment
Я попытаюсь заменить :datetime другим форматом, чтобы увидеть, исправлено ли поведение: datetime-timestamp-time-and-da" title="в рубине на рельсах, в чем разница между датой и временем, отметкой времени и da"> stackoverflow.com/questions/3928275/   -  person Jonathan_W    schedule 17.05.2016
comment
Вы случайно не определили attr_accessor в своей модели? Если это так, вы должны удалить его, потому что он переопределяет атрибуты.   -  person Petr Gazarov    schedule 21.05.2016
comment
Удивительно @PetrGazarov! Пожалуйста, сделайте это ответом, чтобы я мог отметить его как правильный. И большое спасибо, что вернулись к этому, я был на грани отчаяния, так как весь мой проект был приостановлен.   -  person Jonathan_W    schedule 21.05.2016


Ответы (1)


Это происходит из-за того, что вы вызвали attr_accessor в своей модели с атрибутами модели, которые переопределили методы доступа по умолчанию, предоставленные Rails (аксессоры вызываются методами update и new). Обратите внимание на этот документ, для справки, если вы делаете когда-нибудь захотите переопределить методы доступа.

Удаление attr_accessor из вашей модели поможет!

person Petr Gazarov    schedule 21.05.2016