Ruby on rails RESTAPI Ruby On Rails嵌套模型

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

我对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 :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)