【问题标题】:Mongoid virtual attributes in to_jsonto_json 中的 Mongoid 虚拟属性
【发布时间】:2013-03-28 21:56:24
【问题描述】:

我正在尝试让一些虚拟(非持久)属性显示在某些 Mongoid 模型的 JSON 表示中,但似乎无法使其工作:

class MyModel
  include Mongoid::Document

  def virtual_attribute
    @my_attribute || false
  end

  def virtual_attribute=(value)
    @my_attribute=value
  end
end

class MyController
  def myaction
    false_values=MyModel.where( whatever )
    true_values=MyModel.where( something_else ).map{ |model| model.virtual_attribute=true }
    @val['my_models']=false_values+true_values
    render json: @val.to_json( :include => {:my_models => {:methods => %w(virtual_attribute)}} )
  end
end

virtual_attribute 不会出现在 json 中。我做错了什么?

编辑 - 好的,所以我想我的实际问题是我无法弄清楚如何在嵌套在根对象中的每个对象数组上调用 virtual_attribute 方法.

【问题讨论】:

    标签: ruby-on-rails mongoid


    【解决方案1】:

    to_json 将选项直接传递给数组和对象。 :include 只是一个 Mongoid 东西:

    render json: @val.to_json(methods: :virtual_attribute)
    

    【讨论】:

    • 但这假设我直接在数组上调用to_json,对吧?一切似乎都表明它调用了virtual_attribute,就我而言,@val 而不是@val['my_models'] - 我只是悲剧性地弄错了吗?
    • 嗯,这取决于。由于您没有指定 @val.class 是什么,我假设它是 HashHash 只会将选项传递给 @val['my_models'] ,而 @val['my_models'] 又会将选项传递给您的模型。
    • @val 实际上是一个 Mongoid 模型 - 我没有意识到 methods 通常应用于所有子对象。无论如何,我对此的实验似乎失败了......
    • 我刚刚使用 Mongoid 模型对其进行了测试,它的工作方式相同,因为 @val['my_models'] 不是关系。只有关系需要:include
    • 当时肯定有一些我不明白的非常奇怪的事情,因为它没有在我的 json 中包含该属性......让我从我的另一个问题中尝试你的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多