2

モデルCOUNTRIES内に作成された完全な国名と略語のリストを持つRailsアプリがあります。Companyリストの配列はCOUNTRIES、入力フォームの select タグに使用され、略語を DB に格納します。下記参照。VALID_COUNTRIESDB の略語の検証に使用されます。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",...}

DBから略語を取得し、必要な完全な国名を表示するには:

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

COUNTRIES.keysorは検証リストを提供するため、これは残念COUNTRIES.valuesです(使用されるハッシュレイアウトによって異なります)。

私はRuby/Railsに比較的慣れていないので、問題を解決するためのRubyのような方法を探しています。質問は次のとおりです。

  1. 転置は 1 回だけ行われますか? その場合、いつ実行されますか?
  2. 転置を必要としない FULL_ および VALID_ リストを指定する方法はありますか?
  3. これを行うためのより良い、または合理的な代替方法はありますか? たとえば、VALID_COUNTRIES は COUNTRIES[x][1] で、FULL_COUNTRIES は COUNTRIES[x][0] ですが、VALID_ は検証で機能する必要があります。
  4. select_tagDB 内の略語を完全な名前に変換して表示するためのハッシュではなく、1 つのハッシュだけでハッシュを機能させる方法はありますか?
4

1 に答える 1

3

1) 転置は 1 回だけ行われますか? その場合、いつ実行されますか?

ラムダを使用するたびに定数を評価する場合は、定数に割り当てているため、コンパイル時にはい

  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オプション値に使用されるため、ハッシュが機能しない理由がわかりません。なぜそうでないのかを明確にできれば、最初に指定したハッシュが機能するはずです。もっと。

于 2012-05-31T01:20:21.583 に答える