我有一个 Rails 应用程序,其中包含在模型中COUNTRIES
创建的完整国家名称和缩写的列表。Company
列表的数组用于COUNTRIES
输入表单上的选择标记,以在 DB 中存储缩写。见下文。VALID_COUNTRIES
用于验证数据库中的缩写。FULL_COUNTRIES
用于从缩写中显示完整的国家名称。
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",...}
同时从数据库中获取缩写并显示我需要的完整国家名称:
COUNTRIES = {"AF" => "Afghanistan", "AX" => "Aland Islands", "AL" => "Albania",...}
真可惜,因为COUNTRIES.keys
orCOUNTRIES.values
会给我验证列表(取决于使用哪种哈希布局)。
我对 Ruby/Rails 比较陌生,正在寻找更类似于 Ruby 的方法来解决问题。以下是问题:
- 转置是否只发生一次,如果是,何时执行?
- 有没有办法指定不需要转置的 FULL_ 和 VALID_ 列表?
- 有没有更好或更合理的替代方法来做到这一点?例如,VALID_COUNTRIES 是 COUNTRIES[x][1],FULL_COUNTRIES 是 COUNTRIES[x][0],但 VALID_ 必须与验证一起使用。
- 有没有一种方法可以使哈希只使用一个哈希而不是一个用于 the
select_tag
和一个用于将数据库中的缩写转换回全名以供显示?