Techioz Blog

Ruby on Rails、同じ名前の enum を使用する問題

概要

私の見解では、ドロップダウンの一部を以下に示します。

<div class="col-xs-3">
    <%= f.select(:require_booking, get_advance_booking.collect {|p| [ p[:require_booking], p[:require_booking] ] }, {include_blank: false} , :class => 'form-control') %>
</div>

そして

<div class="col-xs-3">
    <%= f.select(:instant_booking, get_instant_booking.collect {|p| [ p[:instant_booking], p[:instant_booking] ] }, {include_blank: false} , :class => 'form-control') %>
</div>

そしてこれが私のapplication_helper.rbです

  def get_advance_booking
    ret = [{:require_booking => 'No'},{:require_booking => 'Yes'}]
  end

 def get_instant_booking
    ret = [{:instant_booking => 'No'},{:instant_booking => 'Yes'}]
  end

しかし、今の問題は、私のモデルproduct.rbでは、同じ名前の列挙型を設定できないことです。

class Product < ActiveRecord::Base
    enum require_booking: {
        No: 0,
        Yes: 1
    }
    enum instant_booking: {
        No: 0,
        Yes: 1
    }
end

表示されるエラーは、モデル「Product」で「instant_booking」という名前の列挙型を定義しようとしましたが、別の列挙型によってすでに定義されているインスタンス メソッド「いいえ?」が生成されます。このような対立を解決するにはどうすればよいでしょうか?

解決策

同じ値を持つ複数の列挙型を定義する必要がある場合は、:_prefix または :_suffix オプションを使用できます。渡された値が true の場合、メソッドには列挙型の名前が接頭辞または接尾辞として付けられます。カスタム値を指定することもできます。

class Conversation < ActiveRecord::Base
  enum status: [:active, :archived], _suffix: true
  enum comments_status: [:active, :inactive], _prefix: :comments
 end

ソース:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html