Rails 嵌套属性 JSON 格式

Rails Nested Attributes JSON Formatting

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

时遇到了问题

目前,我的 'as_json' 方法在 Rails 中有这个。

// 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 下,我找不到实现此目的的正确语法。

假设 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

如果 settingssettings_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 看起来 belong_to User(因为你直接引用它)但你想将它嵌套在 Setting 中,这意味着这是一个 "belongs_to :through" 关系,在这一点上我认为你应该让 Setting 负责嵌套。

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