2

我有一个 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.keysorCOUNTRIES.values会给我验证列表(取决于使用哪种哈希布局)。

我对 Ruby/Rails 比较陌生,正在寻找更类似于 Ruby 的方法来解决问题。以下是问题:

  1. 转置是否只发生一次,如果是,何时执行?
  2. 有没有办法指定不需要转置的 FULL_ 和 VALID_ 列表?
  3. 有没有更好或更合理的替代方法来做到这一点?例如,VALID_COUNTRIES 是 COUNTRIES[x][1],FULL_COUNTRIES 是 COUNTRIES[x][0],但 VALID_ 必须与验证一起使用。
  4. 有没有一种方法可以使哈希只使用一个哈希而不是一个用于 theselect_tag和一个用于将数据库中的缩写转换回全名以供显示?
4

1 回答 1

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)有没有办法使哈希工作?

是的,我不确定为什么哈希不起作用,因为 rails 文档说 options_for_select 将hash.to_a.map &:first用于选项文本和hash.to_a.map &:last选项值,所以如果你能澄清为什么它不是,你给出的第一个哈希应该是有效的我可以帮助你更多的。

于 2012-05-31T01:20:21.583 回答