型号说明:
用户,小工具,购买
User
has_many :purchases
has_many :widgets, :through => :purchases
Widget
has_many :purchases
has_many :users, :through => :purchases
Purchase
belongs_to :user
belongs_to :widget
希望这对下面的内容有意义并且是正确的。
是的,在我的控制器中,我有current_user。
我希望最终使用jquery模板呈现嵌套的JSON响应。
像这样理想:
{
"purchases": [
{
"quantity": 200,
"price": "1.0",
"widget": {
"name": "Fantastic Widget",
"size": "Large"
}
},
{
"quantity": 300,
"price": "3.0",
"widget": {
"name": "Awesome Widget",
"size": "Medium"
}
}
]
}
此:
render :json => current_user.to_json(:include => [:purchases, :widgets])
将呈现一些current_user详细信息(不是真正相关),然后在同一级别上购买和小部件。
这有效(输出一些当前用户的详细信息,但这不是我目前的主要抱怨):
render :json => current_user.to_json({:include => :purchases })
但显然只输出购买数据。即使在查看此示例之后,我也无法获得嵌套的包含工作(它应该工作吗?):
konata.to_json(:include => { :posts => {
:include => { :comments => {
:only => :body } },
:only => :title } })
来自here和此existing stackoverflow question。
所以我让自己完全糊涂了。帮助赞赏。
答案 0 :(得分:2)
我会考虑在模型中使用as_json方法来获得所需的输出。将以下内容添加到模型中可以使您朝着正确的方向前进。
#users model
def as_json(options={})
{:purchases => self.purchases}
end
#purchases model
def as_json(options={})
{:quantity: self.quantity,
:price: self.price,
:widget: self.widget}
end
#widgets model
def as_json(options={})
{:name:self.name,
:size: self.size}
end
添加完这些后,您只需在用户实例上使用to_json
即可正确输出。
答案 1 :(得分:2)
RABL可让您制作类似于HTML ERB视图的JSON视图。
此博文“If you’re using to_json
, you’re doing it wrong”解释了使用to_json
的一些背景和缺点。