使用虚拟属性接受嵌套属性

Swa*_*y g 9 activerecord ruby-on-rails

我有一个Project模型,它接受任务的嵌套属性.而Task有一个虚拟属性"name".因此,每次更改名称时,它都会在更新前保持为encrypted_task_name.在项目编辑页面上,表单具有任务名称的输入字段(而不是encrypted_task_name).当我更改名称并且因为name是虚拟属性时,Rails不检测Task中的更改,并且在更新Project时不会更新该任务.

即使在项目更新期间更改了虚拟属性,如何确保保存任务?

我不想使用的一个选项是:task.rb上的autosave => true,因为我的任务很少更新.

Dav*_*est 26

我遇到了同样的问题.使用:autosave => true甚至没有为我工作.我设法通过添加attribute_will_change!(:my_virtual_attribute)到我的虚拟属性的编写器来解决它.所以,在你的情况下:

class Task < ActiveRecord::Base
  ..
  def name=(the_name)
    attribute_will_change!(:name)
    ..
  end
  ..
end
Run Code Online (Sandbox Code Playgroud)

这会将对象标记为未更改或脏,并使update_attributes正确保存嵌套模型.

链接:

http://apidock.com/rails/ActiveRecord/Dirty/attribute_will_change%21 http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects

  • 希望我能更多地投资你.你知道当你不知道为什么会出现问题时,那么SO会对你想要的东西产生确切的答案吗?是的,那恰好发生在我身上. (2认同)
  • 我知道那种感觉.想知道是时候自己制作其中一个答案:-).谢谢你的upvote! (2认同)