Mongoid 自定义 setter 不适用于嵌入式字段

Mongoid custom setter not working on embedded field

我有在另一个系统中创建的复杂 Mongoid 文档,我希望能够编辑隐藏在文档树中的字段。我不想创建嵌入式模型,我更愿意使用自定义 setter/getters。 getter 工作正常但 setter 不是,它似乎工作,没有错误,但数据永远不会保存到数据库中。按照 Mongoid site 上的示例,这里是我的模型;

class MyModel

  field :name
  
  def subfield
    self.attributes["value"][0]["value"]
  end

  def subfield=(array)
    p 'Setting.. '
    self.attributes["value"][0]["value"]=array
    p '.. done!'
  end

end


>> mod = MyModel.last
#<MyModel _id: 55566a8b53307b2c3f99737d, name: "nonlinear_avm">
>> mod.subfield 
[1, 2]
>> mod.subfield = [3,4]
"Setting.. "
".. done!"
[3,4]
>> mod.save! 
true
>> mod.reload 
#<MyModel _id: 55566a8b53307b2c3f99737d, name: "nonlinear_avm">
>> mod.subfield 
[1, 2]

如您所见,该字段永远不会被保存。
任何帮助都会很棒!

问题是您在 Mongoid 的背后更改 values,因此它不知道您已更改任何内容。这个:

self.attributes["value"][0]["value"]=array

就地更改 value 属性,因此数组本身不会改变,只有它的内容会改变。您应该能够通过手动将字段标记为脏来解决此问题:

def subfield=(array)
  value_will_change!
  self.attributes["value"][0]["value"]=array
end

这应该让 value 出现在 changed_attributes 列表中,并且应该说服 Mongoid 在您 save.

时在数据库中更新它