2010-12-17 81 views
0

我是Rails的新手,並試圖瞭解如何使用Rails中可用的工具構建「複雜」模型(及其關聯)。快速想象下面的示例場景:Users是ONE比賽的成員Team。用戶可以創建CarsSchedules。這些汽車有Drivers,Fuel等級,EnginesWheels。這些Wheels具有Tires,HubsMilesDriven。你的想法...將模型與父項關聯的基本導軌模式(嵌套?)

鑑於所有關於嵌套只有1級深的警告......我仍然奮鬥着如何將REST風格和Rails-Y和呈現的用戶界面,允許用戶建立一個CarTires

我知道我們有一個Session & Cookie在我們的處置以及隱藏的領域。因此,用戶登錄...並路由到他們的團隊頁面teams(current_user.team_id)。然後他們想創建一個Car。這路線new_team_car_path(current_user.team_id)他們可以在那裏建立一輛車...現在我想添加一個車輪到這輛車...所以這樣的路線new_team_car_wheel_path(current_user.team_id, car_id)等等,等等......?我想不是......但是,Rail-y的方式是什麼?

此外,內置一切都將被關聯,最終,一隊(和用戶),它最好是「進位」的team_id和/或user_id協會一路下跌到Tire是合理的通過在運行時關聯層次結構來查詢Team

我敢肯定,這是基本的東西,但newbness有我困惑如何最好地接近它...

回答

1

沒有單一的回答這個問題。您提到使用會話變量和隱藏字段 - 這些都是可行的方法,決定必須基於特定的要求。你努力尋找最佳答案的事實是一個好兆頭,因爲它表明你願意考慮替代方案。

在這種情況下,由於您的授權碼已經在控制器中可用,因此您無需傳遞用戶信息或其URL中的關聯。所以我想從您的PARAMS從current_user刪除用戶和團隊的ID和訪問它們:

#GET /汽車/:car_id /輪/新

def new 
    @car = Car.find(params[:car_id]) 
    @wheel = @car.wheels.build 
end 

#POST /汽車/:car_id /車輪

def create 
    @user = current_user 
    @team = @user.team 
    @car = Car.find(params[:car_id] 
    @wheel = @car.wheels.build(params[:car][:wheel]) 
    ... 
end 

唯一的問題是,如果你需要允許用戶訪問其他用戶的Car。在這種情況下,選擇用戶的隱藏表單域(或下拉菜單)應該可以工作。相反,您可能需要授權檢查以防止用戶訪問對方的'Car'

+0

ok。謝謝!所以,爲了澄清......你認爲將'user' *和*'team'嵌入到'car'(或'wheel',或者任何深度嵌套的資源)是值得的?與在你需要的時候或在你需要的時候,'belongs_to'鏈回到找到'user'或'team'的對比?!?如果是這樣,這是出於優化原因?所以你不是經常查詢數據庫?要麼..?? – Meltemi 2010-12-17 23:10:01

+0

在這種特殊情況下,您已經支付了查找用戶的性能成本,因爲Devise(或其他)在每個請求上都會這樣做。所以我說你*不需要嵌套資源,因爲有一種內置的方式來檢測user和它的關聯。 – zetetic 2010-12-17 23:16:11