2012-05-31 99 views
2

我有一個Rails應用程序,它有一個COUNTRIES列表,其中包含在Company模型中創建的完整國家和縮寫。 COUNTRIES列表的數組用於輸入表單上的選擇標記,以在數據庫中存儲縮寫。見下文。 VALID_COUNTRIES用於DB中縮寫的驗證。 FULL_COUNTRIES用於顯示縮寫的完整國家名稱。我可以避免在Ruby on Rails中轉換數組嗎?

class Company < ActiveRecord::Base 

    COUNTRIES = [["Afghanistan","AF"],["Aland Islands","AX"],["Albania","AL"],...] 
    COUNTRIES_TRANSFORM = COUNTRIES.transpose 
    VALID_COUNTRIES = COUNTRIES_TRANSPOSE[1] 
    FULL_COUNTRIES = COUNTRIES_TRANSPOSE[0] 

    validates :country, inclusion: { in: VALID_COUNTRIES, message: "enter a valid country" } 
    ... 
end 

在形式:

<%= select_tag(:country, options_for_select(Company::COUNTRIES, 'US')) %> 

而且轉換回完整的國名:

full_country = FULL_COUNTRIES[VALID_COUNTRIES.index(:country)] 

這似乎是一個散列一個優秀的應用,除了鍵/值訂單是錯誤的。對於選擇,我需要:

COUNTRIES = {"Afghanistan" => "AF", "Aland Islands" => "AX", "Albania" => "AL",...} 

雖然從DB採取的縮寫,顯示完整的國名,我需要:

COUNTRIES = {"AF" => "Afghanistan", "AX" => "Aland Islands", "AL" => "Albania",...} 

這是一種恥辱,因爲COUNTRIES.keysCOUNTRIES.values會給我驗證列表(取決於使用哪個哈希佈局)。

我對Ruby/Rails比較陌生,正在尋找更類似於Ruby的方式來解決這個問題。以下是問題:

  1. 轉置是否只發生一次,如果是,它何時執行?
  2. 有沒有辦法指定不需要轉置的FULL_和VALID_列表?
  3. 有沒有更好的或合理的替代方法來做到這一點?例如,VALID_COUNTRIES是COUNTRIES [x] [1],FULL_COUNTRIES是COUNTRIES [x] [0],但VALID_必須與驗證配合使用。
  4. 有沒有辦法使用一個散列而不是一個散列來處理select_tag,另一個用於將數據庫中的縮寫轉換爲全名以顯示?
+0

什麼是 雖然顯示完整的國家名稱我需要: 'COUNTRIES = {「AF」=>「阿富汗」,「AX」=>「奧蘭羣島」,「AL」=>「阿爾巴尼亞」。 ..' 表示? – austinbv

+0

請參閱上面的修改。數據庫中的國家縮寫需要轉換回完整的國家名稱才能顯示。 –

回答

3

1)轉置是否只發生一次,如果是,它何時執行?

是在編譯的時候,因爲你如果你希望它是評估每次使用lambda

FULL_COUNTRIES = lambda { COUNTRIES_TRANSPOSE[0] } 

2)分配給常量是否有指定FULL_和VALID_列表的方式那不需要轉置?

是使用地圖或收集(它們是一回事)

VALID_COUNTRIES = COUNTRIES.map &:first 
FULL_COUNTRIES = COUNTRIES.map &:last 

3)是否有更好的或合理的替代辦法做到這一點?例如,VALID_COUNTRIES是COUNTRIES [x] [1],FULL_COUNTRIES是COUNTRIES [x] [0],但VALID_必須與驗證配合使用。

見上面

4)有沒有一種方法,使哈希工作?

是的,我不知道爲什麼哈希未正常工作軌道文檔說options_for_select將使用hash.to_a.map &:first的選擇文本和hash.to_a.map &:last的期權價值,因此第一哈希你給應該工作,如果你能澄清爲什麼不是我可以幫助你更多。

+0

優秀的答案。說你的地圖解決方案比我的轉換解決方案更有效率嗎?但是,兩者都創建了數據的新副本,並執行代碼來執行此操作,而3)中的描述僅適當地映射了當前數據的索引。有沒有一種合理的方法來創建這個映射,所以它看起來像一個單一的維數組,所以像包含這樣的東西:將工作? –

+0

哈希函數有效,但我需要兩個不同的哈希值 - 一個用於select_tag將完整的國家名稱轉換爲縮寫,另一個用於將縮寫轉換回完整的國家名稱進行顯示。似乎應該有一個相對有效/簡單的方法來做到這一點,而不需要複製數據。 –

相關問題