2012-04-23 65 views
0

我在Rails 3.2.2應用程序上有一個Ruby 1.9.3,我正在處理一些需要包含類型的has_many關聯。例如:Rails中的類型類

  • 用戶有很多飛機。這架飛機屬於某種類型(塞斯納172)。
  • 用戶有許多許可證。這些許可證屬於某種類型(私人飛行員執照)。
  • 許可has_many等級。評級屬於某種類型(單發活塞級評級)。

我的問題是命名所有這些類。現在用戶的關聯被命名爲Aircraft,LicenseRating,但這仍然要求我命名類型類。我最初有他們的名字叫AircraftType,LicenseTypeRatingType但這個味道給我。

現在我有一個專門的模塊Types所有這些類型的類,所以我喜歡的類型類現在命名爲Types::AircraftTypes::LicenseTypes::Rating但我不知道這有我遇到麻煩的道路給出了可疑的支持Rails中的命名空間我一直聽到。

這種問題有沒有一個慣例或標準做法?

更新:

由於飛機類型的列表會定期更新,我需要這些是在數據庫中。儘管許可證類型和評分變化較少,但如果我需要添加,更改或刪除任何許可證,我仍然更喜歡它們在數據庫中。這種排除了靜態地在類中定義它們的規則。

回答

2

您可以將模型中的類型作爲類方法來使用,因爲它們與模型緊密關聯。喜歡的東西:

class Aircraft < ActiveRecord::Base 
    def self.XTypes 
    ['Cessna 172','Cessna 152','Boeing 747'] 
    end 
end 

只要不使用「類型」,如軌道預留,對於單表繼承,其實「類型」甚至可能是危險的,但是,這將是很好的保留屬性名稱對於所有具有類型的模型都是一樣的,至少可以打開DRYer代碼的可能性,您可以在所有具有XType的模型之間共享一些代碼,比如在視圖幫助器中爲任何模型創建select元素有一個XType。

所以,通常你會使用XTypes這樣的:

<%= f.select 'xtype', Aircraft.XTypes %> 

的XTypes的大名單,他們是修改/添加/刪除越容易出現,你應該考慮把他們在一個單獨的模型並將它們與has_one關聯關聯起來,但如果它們相當靜態,上述方法可能會很好。

UPDATE:

我認爲單表繼承可能是票,要麼或只是一個簡單的HAS_ONE關係。但是,這聽起來像你想所有這些類型的凝結成一個單一的實體,所以你可能要STI

class mytype < ActiveRecord::Base; end 
class AircraftType < mytype; end 
class LicenseType < mytype; end 

你只需要添加在你MYTYPE模式叫「類型」的字符串屬性,並與填充在值'AircraftType'或'LicenseType'。現在你有一個模型,可以容納所有類型的,也就是說,如果你正在編輯的許可記錄,並且要LicenseTypes的選擇元素,你可以這樣做:

<%= f.select 'type', LicenceType.all().map {|t|, [t.id, t.description] } 

如果你正在編輯的飛機:

<%= f.select 'type', AircraftType.all().map {|t|, [t.id, t.description] } 

這個假設基本MYTYPE模型有一個屬性「描述」

+0

嗨布拉德,感謝您的快速響應!我的道歉,也許我應該更清楚。我需要這些類型在數據庫中,因爲它們可能會發生變化(飛機類型比其他類型更多),因此我的難題在於。我已更新我的原始問題 – Laurens 2012-04-23 17:18:53

+0

好的,我會更新我的答案 – RadBrad 2012-04-23 17:23:26

+0

謝謝布拉德!剛剛啓動並運行,並非常喜歡這個解決方案,效果很好! – Laurens 2012-04-24 15:33:21