【问题标题】:Mongoid custom setter not working on embedded fieldMongoid 自定义设置器不适用于嵌入式字段
【发布时间】:2015-05-18 22:13:30
【问题描述】:

我有在另一个系统中创建的复杂 Mongoid 文档,我希望能够编辑隐藏在文档树中的字段。我不想创建嵌入式模型,我更喜欢使用自定义 setter/getter。 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]

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

【问题讨论】:

    标签: ruby-on-rails mongoid


    【解决方案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 时在数据库中更新它。

    【讨论】:

    • 我在 'value_will_change! ' 我是否需要包含一些内容才能获得该方法?
    • 模型中有field :value吗?
    • 不,它是一个动态字段,我添加了 include Mongoid::Attributes::Dynamic
    • 您可以为其添加field 声明吗?要么,要么您可能需要用不同的数组替换整个 value 属性,以便 self.attributes['value'].object_id 会改变;这将是文档提到的write_attribute 方法。
    • 谢谢@mu 我为value 添加了一个字段声明,现在value_will_change! 方法可以强制使用脏标志。我仍然对在树中某处包含 . 的键名有疑问,但这让我朝着正确的方向前进!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多