我有复杂的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]
正如您所看到的,该字段永远不会被保存 任何帮助都会很棒!
答案 0 :(得分:1)
问题是你在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
时在数据库中更新它。