2017-07-07 94 views
2

的指標,我有以下途徑Rails的深度嵌套與父母

resources :continent do 
    resources :countries do 
     resource :cities do 
      resource :streets 
     end 
    end 
    end 

要選擇一個國家,我會做

/continents/:continent_id/countries/:country_id 

等。

我的問題是如何獲得特定國家或大陸的所有街道。或一個特定大陸的所有國家。

例如有沒有辦法做到

/continents/:continent_id/countries/cities 

將返回在所有城市:continent_id

回答

3

資源不應該被嵌套超過10級深。參考:http://weblog.jamisbuck.org/2007/2/5/nesting-resources

如果你真的需要那種深度,那麼你可以用淺屬性設置爲true來解決這個問題。 參考:http://edgeguides.rubyonrails.org/routing.html#shallow-nesting

更新爲更好地解釋利用淺層嵌套

rails new shallow-routes 
cd shallow-routes 

編輯config/routes.rb添加你想要的路線

resources :continent do 
    resources :countries do 
     resource :cities do 
      resource :streets 
     end 
    end 
    end 

現在正在運行rake routes,我們有這樣的:

       Prefix Verb URI Pattern                 Controller#Action 
    continent_country_cities_streets POST /continent/:continent_id/countries/:country_id/cities/streets(.:format)  streets#create 
new_continent_country_cities_streets GET /continent/:continent_id/countries/:country_id/cities/streets/new(.:format) streets#new 
edit_continent_country_cities_streets GET /continent/:continent_id/countries/:country_id/cities/streets/edit(.:format) streets#edit 
             GET /continent/:continent_id/countries/:country_id/cities/streets(.:format)  streets#show 
             PATCH /continent/:continent_id/countries/:country_id/cities/streets(.:format)  streets#update 
             PUT /continent/:continent_id/countries/:country_id/cities/streets(.:format)  streets#update 
             DELETE /continent/:continent_id/countries/:country_id/cities/streets(.:format)  streets#destroy 
      continent_country_cities POST /continent/:continent_id/countries/:country_id/cities(.:format)    cities#create 
     new_continent_country_cities GET /continent/:continent_id/countries/:country_id/cities/new(.:format)   cities#new 
     edit_continent_country_cities GET /continent/:continent_id/countries/:country_id/cities/edit(.:format)   cities#edit 
             GET /continent/:continent_id/countries/:country_id/cities(.:format)    cities#show 
             PATCH /continent/:continent_id/countries/:country_id/cities(.:format)    cities#update 
             PUT /continent/:continent_id/countries/:country_id/cities(.:format)    cities#update 
             DELETE /continent/:continent_id/countries/:country_id/cities(.:format)    cities#destroy 
        continent_countries GET /continent/:continent_id/countries(.:format)         countries#index 
             POST /continent/:continent_id/countries(.:format)         countries#create 
       new_continent_country GET /continent/:continent_id/countries/new(.:format)        countries#new 
       edit_continent_country GET /continent/:continent_id/countries/:id/edit(.:format)      countries#edit 
        continent_country GET /continent/:continent_id/countries/:id(.:format)        countries#show 
             PATCH /continent/:continent_id/countries/:id(.:format)        countries#update 
             PUT /continent/:continent_id/countries/:id(.:format)        countries#update 
             DELETE /continent/:continent_id/countries/:id(.:format)        countries#destroy 
         continent_index GET /continent(.:format)               continent#index 
             POST /continent(.:format)               continent#create 
         new_continent GET /continent/new(.:format)              continent#new 
         edit_continent GET /continent/:id/edit(.:format)            continent#edit 
          continent GET /continent/:id(.:format)              continent#show 
             PATCH /continent/:id(.:format)              continent#update 
             PUT /continent/:id(.:format)              continent#update 
             DELETE /continent/:id(.:format)              continent#destroy 

讓我們改變資源爲淺築巢,並期待在結果

resources :continent, shallow: true do 
    resources :countries do 
     resource :cities do 
      resource :streets 
     end 
    end 
    end 

它的結果

     Prefix Verb URI Pattern           Controller#Action 
    country_cities_streets POST /countries/:country_id/cities/streets(.:format)  streets#create 
new_country_cities_streets GET /countries/:country_id/cities/streets/new(.:format) streets#new 
edit_country_cities_streets GET /countries/:country_id/cities/streets/edit(.:format) streets#edit 
          GET /countries/:country_id/cities/streets(.:format)  streets#show 
          PATCH /countries/:country_id/cities/streets(.:format)  streets#update 
          PUT /countries/:country_id/cities/streets(.:format)  streets#update 
          DELETE /countries/:country_id/cities/streets(.:format)  streets#destroy 
      country_cities POST /countries/:country_id/cities(.:format)    cities#create 
     new_country_cities GET /countries/:country_id/cities/new(.:format)   cities#new 
     edit_country_cities GET /countries/:country_id/cities/edit(.:format)   cities#edit 
          GET /countries/:country_id/cities(.:format)    cities#show 
          PATCH /countries/:country_id/cities(.:format)    cities#update 
          PUT /countries/:country_id/cities(.:format)    cities#update 
          DELETE /countries/:country_id/cities(.:format)    cities#destroy 
     continent_countries GET /continent/:continent_id/countries(.:format)   countries#index 
          POST /continent/:continent_id/countries(.:format)   countries#create 
     new_continent_country GET /continent/:continent_id/countries/new(.:format)  countries#new 
       edit_country GET /countries/:id/edit(.:format)      countries#edit 
        country GET /countries/:id(.:format)        countries#show 
          PATCH /countries/:id(.:format)        countries#update 
          PUT /countries/:id(.:format)        countries#update 
          DELETE /countries/:id(.:format)        countries#destroy 
      continent_index GET /continent(.:format)         continent#index 
          POST /continent(.:format)         continent#create 
       new_continent GET /continent/new(.:format)        continent#new 
      edit_continent GET /continent/:id/edit(.:format)      continent#edit 
        continent GET /continent/:id(.:format)        continent#show 
          PATCH /continent/:id(.:format)        continent#update 
          PUT /continent/:id(.:format)        continent#update 
          DELETE /continent/:id(.:format)        continent#destroy 

它的圖像對更好的視野差異http://i.imgur.com/21CEM7j.png

我們這裏又是什麼路線比較簡單,像/continent/:continent_id/countries這樣的路線現在只存在於索引,創建和新的其他都在大陸範圍之外在路線

請注意,這是真正有用的,因爲你並不需要的路線告訴你,一個街道是一個大陸內部,這是顯而易見的,如果你的街是一個城市裏面,這是當然的國境內還有大陸。

直接的答案 - 現在讓我們來看看你的目標在這裏

/大洲/:continent_id /國家/城市

您希望大陸的所有城市,爲什麼[在地獄,對不起]你需要他們之間的國家嗎?

我只是做/continents/:id/cities,簡單得多,很容易理解。

爲了實現您剛纔創建大洲內一個新的路由資源

resources :continent, shallow: true do 
    member do 
     get 'cities' 
    end 

    resources :countries do 
     resource :cities do 
      resource :streets 
     end 
    end 
    end 

,然後你有這個新的漂亮的路線

cities_continent GET /continent/:id/cities(.:format)      continent#cities 
+0

淺築巢我會怎麼做我想要的功能 – srmeile

+1

@ user3839189檢查我的這個答案 –

+0

的更新謝謝你的偉大的解釋@Ramon馬克斯 – srmeile

1

您可以使用下面的模型關係

class Country < ActiveRecord::Base 
    has_many :streets, :through => : cities 
end 

所以,你可以使用例如代碼

Country.find(1).streets