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
下,我找不到实现此目的的正确语法。
假设 settings
和 settings_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
看起来 belong_to User
(因为你直接引用它)但你想将它嵌套在 Setting
中,这意味着这是一个 "belongs_to :through" 关系,在这一点上我认为你应该让 Setting
负责嵌套。
最后,如果您想开发复杂的 JSON 输出,而不是覆盖 as_json,您应该考虑使用 jbuilder(通常与 rails 捆绑在一起)因为它将您的 JSON 逻辑从您的模型中移出并移入视图中,这可以说是构建您如何查看数据的更合适的地方。 JBuilder 更擅长设计复杂的 JSON.
我正在尝试覆盖 '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
下,我找不到实现此目的的正确语法。
假设 settings
和 settings_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
看起来 belong_to User
(因为你直接引用它)但你想将它嵌套在 Setting
中,这意味着这是一个 "belongs_to :through" 关系,在这一点上我认为你应该让 Setting
负责嵌套。
最后,如果您想开发复杂的 JSON 输出,而不是覆盖 as_json,您应该考虑使用 jbuilder(通常与 rails 捆绑在一起)因为它将您的 JSON 逻辑从您的模型中移出并移入视图中,这可以说是构建您如何查看数据的更合适的地方。 JBuilder 更擅长设计复杂的 JSON.