2016-02-26 44 views
0

显示数据我熟悉的方针没有嵌套超过1级深,我了解同时具有在最短的URL的各种讨论并没有代码。的Rails 4.2+:深嵌套资源时,它需要从整个资源链

大部分StackOverflow的问题和谷歌上搜索我已经提出使用情况下,一个没有访问所有元素在整个链条进行回答这个问题。

但是如果你有进一步访问父资源,环比上涨为你正在使用的每一个网页你会怎么做?

/{ACCOUNT_SLUG}/applications/{APPLICATION_UUID}/borrower/employments/{UUID}

当与单个employment记录处理,我要显示帐户的特定信息经由ACCOUNT_SLUG采取从父account对象,以及application信息。上和技术上,我borrower也是一个DB查询,但由于只有1为每个应用程序,我没有在URL中添加一个id /塞。

一般的建议是做一些事情,如:

/employments/{UUID}

但如果我这样做,然后在我的控制器代码(和其他地方)我还要做:

@employment = Employment.find_by(uuid: params[:uuid]) 
@account = @employment.borrower.application.account 

所以我必须遍历整个父关联链并执行这些关联数据库查询。一个人如何解决这种从第一个父母到最后一个孩子必须保持深层嵌套关系的情况?

1:添加关联属性所有的孩子们

class Employment 
    belongs_to :borrower 
    belongs_to :application 
    belongs_to :account 
end 

现在我有一大堆协会事情无处不在,只是走一个清晰的链条。这似乎是“依赖地狱”给我......

2:深嵌套的路线去; Github上做它

我注意到其实Github上采用深嵌套的路线:

github.com/{USERNAME}/{REPO}/settings/hooks

虽然没有深度嵌套为我的使用情况下,他们仍然窝一切usernamerepo下,和如果你列出自己的详细地址是:

/github.com/accounts/{USERNAME}/repos/{REPO_NAME}/settings/hooks

是任何人都知道,如果有Github上的方法优化这个深度嵌套,或者他们只是找了accountrepo每个请求和咬DB查询开销(也许不是什么大不了的事......)?

3:深窝的路由,而让自己的网址助手,以保持它的清洁

使用/{ACOUNT_SLUG}/applications/{APPLICATION_UUID}/borrower/employments/{UUID},网址助手看起来像:

account_applications_borrower_employments_path(@account, @application, @borrower, @employment) 

这可以被清理使用一些帮手:

def borrower_employment_path(@employment) 
    @borrower = @employment.borrower 
    @application = @borrower.application 
    @account = @application.account 
    account_applications_borrower_employments_path(@account, @application, @borrower, @employment) 
end 

回答

0

非常详细的问题。有点迟来了,但在过去,当嵌套资源的问题困扰我时,通常最终需要重新考虑我关系模型化数据库的方式。

在你提出的可能的解决方案中,考虑到Rails框架的固有性质,数字1可能是最好的。 Rails协会非常强大,利用它们在您的应用程序扩展时非常有用。

解决你的模型之间的依赖关系的担忧:

没有看到您的模式,我只能猜测,但你的造型看起来是这样的:

Class Account 
    has_many :applications 
end 

Class Application 
    belongs_to :account 
    has_one :borrower 
    has_one :employment 
end 

Class Borrower 
    belongs_to :application 
end 

Class Employment 
    belongs_to :application 
    has_one :account, through: :application 
end 

这是从解剖我最好的猜测以上信息。有了这个模型,你就可以做到这一点在控制器的行动:

def action_name 
    @employment = Employment.find_by(uuid: params[:uuid]) 
    @account = @employment.account 
end 

你就可以添加额外的关联,比如说,如果你想做的事: @ employment.borrower

通过添加:

class Employment 
    belongs_to :application 
    has_one :account, through: :application 
    has_one :borrower, through: :application 
end 

我总是这样提供一个良好的阅读每一次,而只是为了保持新鲜:

http://guides.rubyonrails.org/association_basics.html#the-types-of-associations

Rails已经普遍被阻止大量嵌套路由,尽管Github上的实现及其应用:

http://guides.rubyonrails.org/routing.html#nested-resources