2016-02-26 60 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