2016-04-21 11 views
3

verwendet, ist hier etwas von der Drop-Down meiner Ansicht nach:Ruby on Rails, Probleme Enum mit dem gleichen Namen

<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> 

und

<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> 

und hier ist mein 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 

Aber jetzt ist das Problem, in meinem Modell product.rb kann ich Enum mit demselben Namen nicht setzen:

Der Fehler, den ich erhalte, ist You tried to define an enum named "instant_booking" on the model "Product", but this will generate a instance method "No?", which is already defined by another enum. Wie löst man solche Konflikte?

+1

Verwenden Sie stattdessen boolesche Werte. Es gibt keinen Grund dafür, dass diese Felder enums sind. –

Antwort

1

Zunächst einmal, genau wie der Marek Lipka sagte, sollten Sie boolean Wert verwenden, um Ihren Fall zu behandeln.

Wenn Sie verschiedene Enums mit denselben Einträgen definieren müssen, empfehle ich stattdessen den 'enumerize' (https://github.com/brainspec/enumerize).

6

Sie können die Optionen _prefix oder: _suffix verwenden, wenn Sie mehrere Enums mit denselben Werten definieren müssen. Wenn der übergebene Wert wahr ist, wird den Methoden der Name der Enumeration vorangestellt. Es ist auch möglich, einen eigenen Wert zu liefern:

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

Quelle: http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html