Ruby on rails ActiveRecord集合的嵌套哈希的Rabl
我有一些Ruby on rails ActiveRecord集合的嵌套哈希的Rabl,ruby-on-rails,ruby,json,serialization,rabl,Ruby On Rails,Ruby,Json,Serialization,Rabl,我有一些ActiveRecord对象,如City、Country、State等。我的控制器操作如下(作为一个典型示例): 我想呈现一个JSON,如下所示: { data: { country: [{id: 1, name: 'a'}, {id: 2, name: 'b'}], state: [{id: 1, name: 'p'}, {id: 2, name: 'q'}], city: [{id: 1, name: 'x'}, {id: 2, name: 'y'}],
ActiveRecord
对象,如City
、Country
、State
等。我的控制器操作如下(作为一个典型示例):
我想呈现一个JSON,如下所示:
{
data: {
country: [{id: 1, name: 'a'}, {id: 2, name: 'b'}],
state: [{id: 1, name: 'p'}, {id: 2, name: 'q'}],
city: [{id: 1, name: 'x'}, {id: 2, name: 'y'}],
version: 1000
}
}
(请注意集合的单数键,请不要建议更改JSON结构,因为它是固定的。)
对于这个问题,
rabl
模板应该是什么?几个小时来,我一直在为这件事伤脑筋。如果我是你,我甚至不想去rabl模板那里做这件事,因为你正在用这段代码创建什么:
@data = {
cities: City.limit(2),
countries: Country.limit(2),
states: State.limit(2),
version: 1000
}
是最终输出,而不是单个组件
您可以将其替换为:
render :json => {
:data => {
cities: City.limit(2).map{ |c|{:id => c[:id] },
countries: Country.limit(2).map{ |c|{:id => c[:id] },
states: State.limit(2).map{ |c|{:id => c[:id] },
version: 1000
}
}
这不是rabl的最佳用例,但是如果您仍然希望通过rabl加载它,下面的代码在get_data.json.rabl中就可以了
node :data do
{
:version_number => @data[:version_number],
:country => @data[:countries].map{ |c|{:id => c[:id] , :name => c[:name]} }
:state => @data[:states].map{ |s|{:id => s[:id] , :name => s[:name]} }
:city => @data[:city].map{ |c|{:id => c[:id] , :name => c[:name]} }
}
end
node :data do
{
:version_number => @data[:version_number],
:country => @data[:countries].map{ |c|{:id => c[:id] , :name => c[:name]} }
:state => @data[:states].map{ |s|{:id => s[:id] , :name => s[:name]} }
:city => @data[:city].map{ |c|{:id => c[:id] , :name => c[:name]} }
}
end