首页 > 解决方案 > Rails 嵌套属性 JSON 格式

问题描述

我正在尝试覆盖“as_json”方法以包含对象的嵌套属性,但我无法正确嵌套 JSON。

目前,我在 Rails 中有这个用于我的“as_json”方法。

// User.rb

def as_json(options = {})
  json = {:id => id, :name => name,
    :settings_attributes => settings.select(:id,:name), 
    :setting_options_attributes => setting_options.select(:id, :amount)}
  json
end

但是,setting_options_attributes应该嵌套在下面settings_attributes,我找不到正确的语法来实现这一点。

标签: ruby-on-railsjsonnested-attributesaccepts-nested-attributes

解决方案


假设settingssettings_options已经是散列,你应该能够做到这一点:

// User.rb
def as_json(options = {})
  {
    id: id, 
    name: name,
    settings_attributes: settings.select(:id,:name).merge({
      setting_options_attributes: setting_options.select(:id, :amount)
    }, 
  }
end

如果settings并且settings_options是模型,那么您可能需要执行以下操作:

// User.rb
def as_json(options = {})
  {
    id: id, 
    name: name,
    settings_attributes: settings.select(:id,:name).map(&:attributes), 
  }
end

// Setting.rb
def attributes
  {
    id: id, 
    name: name,
    setting_options_attributes: setting_options.select(:id,:amount).map(&:attributes), 
  }
end

这有点令人困惑,因为它SettingOption似乎是 belongs_to User(当你直接引用它时)但你想将它嵌套在 内Setting,这意味着它是一个“belongs_to :through”关系,此时我认为你应该Setting对嵌套负责。

最后,如果你想开发复杂的 JSON 输出,而不是覆盖 as_json,你应该考虑使用jbuilder(通常与 rails 捆绑在一起),因为它将你的 JSON 逻辑从模型中移到视图中,这可以说是更合适的构建您如何查看数据的地方。JBuilder 更擅长设计复杂的 JSON。


推荐阅读