Ruby on rails RESTAPI Ruby On Rails嵌套模型
我对rails/ruby这件事有点陌生。我为一个发票应用程序构建了一个restful API。模型概述如下Ruby on rails RESTAPI Ruby On Rails嵌套模型,ruby-on-rails,ruby,api,rest,ruby-on-rails-4,Ruby On Rails,Ruby,Api,Rest,Ruby On Rails 4,我对rails/ruby这件事有点陌生。我为一个发票应用程序构建了一个restful API。模型概述如下 class Invoice < ActiveRecord::Base has_many :pages end class Page < ActiveRecord::Base belogs_to :invoice has_many :rows end class Row < ActiveRecord::Base belogs_to :pa
class Invoice < ActiveRecord::Base
has_many :pages
end
class Page < ActiveRecord::Base
belogs_to :invoice
has_many :rows
end
class Row < ActiveRecord::Base
belogs_to :page
end
这将以数组形式返回散列,例如[:pages]
在控制器中,我将其用作
@response = @invoice.to_json(:include => with_params_hash)
这个很好用。我想能够包括嵌套的模型说页面
正如您所知,这可以通过以下方式实现:
@invoice.to_json(:include => [:page => {:rows}])
我想的第一个问题是如何在URL中表示这一点?我在想:
/invoices?with=pages>行
。假设我就是这样决定的。然后如何将with=pages>rows
转换为[:pages=>{:rows}]
为什么不使用jbuilder?这将是最简单的,你可以嵌套所有模型,你想要的
因此,我最终选择了以下url格式:
/invoices?with=pages>rows
以下功能将生成所需的功能:
def with_params_hash
final_arr = []
with_array = params[:with].split(',')
with_array.each do |withstring|
if withstring.include? ">"
parent = withstring[0..(withstring.index('>')-1)].parameterize.underscore.to_sym
sub = withstring[(withstring.index('>')+1)..withstring.length].parameterize.underscore.to_sym
final_arr << {parent => {:include => sub}}
else
final_arr << withstring.parameterize.underscore.to_sym
end
end
final_arr
end
或者,根据@DavidGuerra的想法,这不是一个坏的选择。在快速扫描您的问题(如果我错过了重要信息,请道歉)之后,所有行的RESTful路径将是:
invoices/3/pages/5/rows
-resource/id/resource/id/resource用于列表,resource/id/resource/id用于单个资源。当然,也可以仅使用资源/id,具体取决于问题。另外,请参见此处:获取一些可能有用或不有用的信息,但应该给出一种处理嵌套资源的方法的想法。@AfaderDarky感谢您的回复。我已经有了类似于invoices/3/pages
,invoices/3/pages/5/rows
等路线。我想这样做的原因是为了减少开销并最小化api调用。原因:如果发票有5页,每页10行。我还得再打5个电话,再加上5个电话才能排到队。我想一次完成所有的工作。希望能有帮助。抱歉,我明白你的问题了。为什么不默认将深层对象(具有相关关联)作为合理的默认用例,然后允许“浅层”选项仅获取父对象?或者您是否需要能够具体说明包含的关联?Hi@david试图避免使用视图。但这是一个很好的答案。我不想重写/修改我的控制器。你知道我懒得修改代码这一事实并不意味着这是一个错误的答案。所以我改用Jbuilder。工作正常。但最后我更喜欢拉布尔
def with_params_hash
final_arr = []
with_array = params[:with].split(',')
with_array.each do |withstring|
if withstring.include? ">"
parent = withstring[0..(withstring.index('>')-1)].parameterize.underscore.to_sym
sub = withstring[(withstring.index('>')+1)..withstring.length].parameterize.underscore.to_sym
final_arr << {parent => {:include => sub}}
else
final_arr << withstring.parameterize.underscore.to_sym
end
end
final_arr
end
@invoice.all.to_json(:include => with_params)