我有一个用于研究抽认卡的Rails应用程序。它工作好几个月,然后最近我在为移动应用程序创建API时进行了一些细微的更改,现在该对象不再存在于数据库中(原因应该与API无关) )。
控制器代码如下:
flashcard.process_card_study(params['ease'].to_i)
debugger
flashcard.save!
process_card_study
是一种模型方法,可根据用户的响应更改属性。这仍然可以正常工作 - 当我使用调试器检查对象时,属性已被适当更改。然后我运行下一行代码来保存它,一切似乎都有效:
(0.8ms) BEGIN
SQL (1.6ms) UPDATE "flashcards" SET "repetition_streak" = $1, "next_study_date" = $2, "times_studied" = $3, "last_recall_quality" = $4, "last_study_date" = $5, "updated_at" = $6 WHERE "flashcards"."id" = $7 [["repetition_streak", 0], ["next_study_date", "2018-01-26 00:00:00"], ["times_studied", 1], ["last_recall_quality", 4], ["last_study_date", "2018-01-26 00:00:00"], ["updated_at", "2018-01-26 18:48:42.307211"], ["id", 200]]
(2.4ms) COMMIT
然后我检查对象是否仍然具有正确的属性(在调试器中仍然是),并且确实如此。但是,当我从调试器中走出时,对象又恢复到原始状态!!
我对该对象的唯一回调是after_initialize,它将所有值设置回初始状态。这似乎可能是罪魁祸首,但是如果回调运行,那么值也会在调试器中重置,而它们不是。更重要的是,我认为保存调用不会运行after_initialize回调。
任何帮助或推动正确的方向将非常感激。 迈克尔
答案 0 :(得分:1)
官方文档http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html说:
块引用 对于由查找程序找到并实例化的每个对象,触发after_find和after_initialize回调,并在实例化新对象后触发after_initialize。
这意味着每次在调试器之后找到此对象时,回调都会将所有内容都设置回来。
f = FlashCard.new # the after_initialize is called
f.save # after initialize is not called
f = FlashCard.last # or find or whatever the after_initialize is called again and resets everything
因此,您可以使用after_initialize进行解决方法,仅使用非持久化记录,如下所示:
after_initialize :do_something, if: :new_record?
def do_something
# do something
end