Rails 对象保存,但不保留?



我有一个用于学习抽认卡的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回调。

任何帮助或推动正确的方向将不胜感激。 迈克尔

官方文档 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

最新更新