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
.
时在数据库中更新它
我有在另一个系统中创建的复杂 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
.