Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ActiveRecord列挙型を使用した簡単で読み取り可能な属性の作成

「保留中」、「承認済み」、または「フラグ付き」のいずれかの質問を想像してみてください。または、「自宅」、「オフィス」、「モバイル」、または「ファックス」の電話番号(1982年の場合)。

一部のモデルでは、この種のデータが必要です。 いくつかの異なる値のうちの1つのみを持つことができる属性。そして、その値のセットはほとんど変更されません。

これは、単純なRubyの場合、記号を使用するだけの状況です。

PhoneNumberTypeまたはQuestionStatusモデルとbelongs_toを作成できます これらの価値観を保持するための関係ですが、それだけの価値はないようです。それらをyamlファイルに詰め込むこともできますが、オブジェクトで何ができるかを理解するには、まったく別の場所を調べる必要があります。

4.1では、RailsはActiveRecord列挙型でこの問題を解決することに挑戦しました。

モデル内のいくつかの値

ActiveRecord列挙型は非常に簡単です。モデルにintegerを与えます 列:

bin/rails g model phone number:string phone_number_type:integer

属性が取ることができる値をリストします:

app / models / phone.rb
class Phone < ActiveRecord::Base
  enum phone_number_type: [:home, :office, :mobile, :fax]
end

そして今、あなたは数字の代わりに文字列を扱うことができます。

これの代わりに:

irb(main):001:0> Phone.first.phone_number_type
=> 3

これが表示されます:

irb(main):002:0> Phone.first.phone_number_type
=> "fax"

変更できます 文字列またはintのいずれかを使用するその属性:

irb(main):003:0> phone.phone_number_type = 1; phone.phone_number_type
=> "office"
irb(main):004:0> phone.phone_number_type = "mobile"; phone.phone_number_type
=> "mobile"

または、バング方式を使用する場合もあります:

irb(main):005:0> phone.office!
=> true
irb(main):006:0> phone.phone_number_type
=> "office"

属性に特定の値があるかどうかを確認するためのメソッドを取得します:

irb(main):007:0> phone.office?
=> true

そして、あなたはすべてを見つけることができます 探している価値のあるオブジェクト:

irb(main):008:0> Phone.office
  Phone Load (0.3ms)  SELECT "phones".* FROM "phones" WHERE "phones"."phone_number_type" = ?  [["phone_number_type", 1]]

使用できるすべての異なる値と、それらが関連付けられている番号を確認する場合は、phone_number_typesを使用してください。 クラスメソッド:

irb(main):009:0> Phone.phone_number_types
=> {"home"=>0, "office"=>1, "mobile"=>2, "fax"=>3}

これにより、HTMLフォームに簡単に入力できます:

app / views / phone / _form.html.erb
<div class="field">
  <%= f.label :phone_number_type %><br>
  <%= f.select :phone_number_type, Phone.phone_number_types.keys %>
</div>

ActiveRecord列挙型を使用した簡単で読み取り可能な属性の作成

注意すべき点

ただし、列挙型には問題がないわけではありません。後で問題が発生したくない場合は、いくつかの点に注意する必要があります。

列挙型を定義するときは、順序が重要です。 したがって、コードに戻って、これらの値を実際にはアルファベット順にする必要があると判断した場合:

app / models / phone.rb
class Phone < ActiveRecord::Base
  enum phone_number_type: [:fax, :home, :mobile, :office]
end

お使いのスマートフォンは、適切なタイプではなくなります。これを回避するには、enumに指示します。 どの数値がどの値に対応するか:

app / models / phone.rb
class Phone < ActiveRecord::Base
  enum phone_number_type: {fax: 3, home: 0, mobile: 2, office: 1}
end

しかし実際には、最善の選択肢は順序の一貫性を保つことです。

より大きな問題は、Railsの世界の外で何をすべきかです。 Railsはこれらの列挙値を文字列と見なしますが、データベース内の単なる数値です。 したがって、生データを見ている人にはありません。 それらの数字が何を意味するのか考えてください。 これは、そのデータベースを読み取るすべてのアプリがその列挙型マッピングを認識している必要があることも意味します。

他の人に見てもらう必要がある場合は、列挙型マッピングをデータベースまたはyamlファイルにダンプできます。しかし、これはDRYではありません。これは、列挙型を2か所で定義しているためです。また、ここまで進んでいる場合は、最初は避けていた方法を実行する方がよい場合があります。つまり、電話がbelong_toになるように、完全に別個のモデルと関連付けを作成します。 PhoneNumberType。

ただし、シンプルに保つ場合は、列挙型を開始するのに最適な方法です。

P.S。見逃した場合は、レールの練習 7月6日月曜日に発売されるRubyBookBundleに含まれる予定です。これと、他の5冊のすばらしいRubyブックを大幅な割引価格で入手してください!


  1. 新しい Android スマートフォンでやるべき 15 のこと

    新しい電話を購入しましたか?スマートフォンをスムーズに動作させたいですか?次に、新しい Android フォンで設定することを理解する必要があります。 21 世紀最大の発明を挙げるとしたら、間違いなく Android フォンでしょう。 Android OS は、常に需要があるものです。あなたが世界のどの地域に属しているかは問題ではありません.Android スマートフォンは、ほとんどの国の市場にあふれています. 自分の専門的なタスクを管理してセルフィーをクリックできる大人から、両親の携帯電話でさまざまなオーディオやビデオを見たり聞いたりしながら楽しむ子供まで、 Androidフォンにできない

  2. Aquaris E4.5 Ubuntu Phone - Android 搭載

    あらまたやっちゃった。残りの 1 台の Ubuntu タッチ デバイスを Android に変換することにしました (穏やかな方法で)。このようにして、私が Ubuntu Phone への期待をやめ、Android を愛するようになったという悲しい物語が始まりました。 とにかく、簡単に説明すると、つまずいていると思われるかもしれませんが、ずっと前に、Ubuntuがモバイル分野で大きくなることを本当に望んでいました。最初に Edge があり、次に Aquaris E4.5 があり、アイデアを広く宣伝するためにいくつかのコンテストを実施しました。タブレットのAquaris M10が出たので迷わず