2011-04-19 41 views
1

我想找到一個乾淨的方法來維護數據庫和模型中的枚舉。在rails模型和數據庫中不斷枚舉

說我有一個類型的

class Foo < ActiveRecord::Base 
    TYPES = {1 => :hello, 2 => :hi} 
end 

我走得更遠,寫了一個枚舉類,所以我可以做的Foo :: TYPES.HELLO恆定枚舉一個ActiveRecord類來獲得1或富: :TYPES.HI得到2.

我想要這些類型的數據庫,所以我可以做連接。我目前正在創建一個FooType模型,並且讓Foo belongs_to:foo_type,所以Foo將有一個foo_type_id字段。

class Foo < ActiveRecord::Base 
    belongs_to :foo_type # 1 -> hello, 2 -> hi 
end 

然而,這是不方便的,因爲:

  • 測試環境打破,除非我播種測試數據庫每次。類型被假定爲常量,因此它們直接用於代碼中。 這可能是最大的痛苦
  • 如果我做一個靜態的枚舉拉foo_type_ids從數據庫到模型中,這也打破了測試
  • 如果我添加一個新的類型,我在每一個數據庫
  • ,以反映此
  • 每個環境需要與類型

回答

1

我用enumerated_attribute寶石從https://github.com/jeffp/enumerated_attribute

這讓你定義枚舉及其在模型值。它的設計目的是在Rails/UI方面(不是那麼多的數據庫)處理它們更容易,但它會爲您維護一個單獨的枚舉模型並確保一致性的麻煩。

它將在測試環境中工作,當您添加新值時不需要更新數據庫,也不需要爲數據庫創建種子。只需爲枚舉的值創建一個新列,剩下的就是gem。它將該值存儲爲一個字符串,因此如果這是您需要的,那麼從數據庫中進行操作非常容易。

-1

在你的代碼普查員只是讓你的代碼可讀性,沒有什麼比其它接種。而不是一個整數(其不具有可讀性的開發人員),可以使用來樣字符串來表示該值

TYPES = {1 => :hello, 2 => :hi} 

我不認爲你可以使用AR的關係就像「belongs_to的」正常類中(非AR)

我想你需要的是兩個表

表 -

foos 
     id 
     type 
     foo_type_id 

foo_types 
     id 
     foo_type 

則U可以有AR

class Foo < ActiveRecord::Base 
    belongs_to :foo_type 
end 

class FooType < ActiveRecord::Base 
    has_many : foos 
end 

如果您打算使用DB解決方案(除了擁有靜態枚舉器),您沒有選項,只能向每個env添加類型。

HTH

歡呼

sameera

+0

應該明確這些類是ActiveRecords。我想要做的是保持模型中定義的常量與db(不帶靜態枚舉器)之間的一致性, – phillee 2011-04-20 15:50:49