Mongoid自定义setter不在嵌入式字段上工作

时间:2015-05-18 22:13:31

标签: ruby-on-rails mongoid

我有复杂的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]

正如您所看到的,该字段永远不会被保存 任何帮助都会很棒!

1 个答案:

答案 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时在数据库中更新它。