2017-12-18 4 views
2

Ich habe ein Modell Tester mit Integer-Spalte tester_type erstellt und enum-Variable im Modell deklariert.Rails - ArgumentError bei Verwendung von ActiveRecord :: Enum

class Tester < ApplicationRecord 
    enum tester_type: { junior: 0, senior: 1, group: 2 } 
end 

ich unten Störung erhalte beim Versuch, ein Objekt für dieses Modell zu erstellen/initialisieren:

ArgumentError: You tried to define an enum named "tester_type" on the model "Tester", but this will generate a class method "group", which is already defined by Active Record.

Also habe ich versucht, tester_type-type_of_tester ändern, aber es wirft gleiche Fehler:

ArgumentError: You tried to define an enum named "type_of_tester" on the model "Tester", but this will generate a class method "group", which is already defined by Active Record.

Ich habe nach der Lösung gesucht und ich fand, dass dieser Fehler eine Konstante ENUM_CONFLICT_MESSAGE in ActiveRecord::Enum Klasse war, aber nicht kann finde die Ursache für dieses Problem.

Bitte helfen Sie mir.

Danke.

+0

ändern Sie den Namen von emum, verwenden Sie nicht testers_type dies wird bereits von Schienen verwendet. – Sunny

+0

Ich habe versucht, es in 'type_of_tester' zu ändern, aber es löst denselben Fehler aus. –

+0

können Sie diesen Fehler auch einfügen. – Sunny

Antwort

2

In diesem Fall, wenn Sie enum verwenden möchten, sind Sie wahrscheinlich besser dran, Ihr Etikett zu etwas anderem umzubenennen. Dies ist nicht spezifisch für Enums - viele Active Record-Funktionen generieren Methoden für Sie und normalerweise gibt es keine Möglichkeiten, diese generierten Methoden zu deaktivieren.

dann ändern group-another_name

ODER Sie sollten diese auch

enum :kind, [:junior, :senior, :group], prefix: :kind 
band.kind_group? 
1

Überprüfung dieses folgen aus. Es ist die Optionsgruppe, mit der Sie ein Problem haben. Sie können, wie in diesem Beitrag erwähnten Präfix Option

enum options

1

Sie die :_prefix oder :_suffix Optionen verwenden können, wenn Sie mehrere Aufzählungen mit gleichen Werten oder in Ihrem Fall müssen definieren, Konflikte mit bereits definierten Methoden zu vermeiden. Wenn der übergebene Wert true ist, wird den Methoden der Name der Enumeration vorangestellt/suffigiert. 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 

Mit dem obigen Beispiel des Knall und Prädikat Methoden zusammen mit den dazugehörigen Bereichen werden nun als Präfix und/oder entsprechend nachgestellt:

conversation.active_status! 
conversation.archived_status? # => false 

conversation.comments_inactive! 
conversation.comments_active? # => false 

Für Ihre Fall wäre mein Vorschlag, wie mit so etwas sein:

class Tester < ApplicationRecord 
    enum tester_type: { junior: 0, senior: 1, group: 2 }, _prefix: :type 
end 

Dann können Sie diese Bereiche als verwenden:

tester.type_group! 
tester.type_group? # => true 

Tester.type_group # SELECT "testers".* FROM "testers" WHERE "testers"."tester_type" = $1 [["tester_type", 2]] 
# or, 
Tester.where(tester_type: :group) # SELECT "testers".* FROM "testers" WHERE "testers"."tester_type" = $1 [["tester_type", 2]] 
Verwandte Themen