2016-07-07 20 views
0

Dies ist das erste Mal, dass ich Schienen enum verwende.Rails Enum, wie man einen Wert aus dem Array entfernt?

Ich habe in meiner App das Benutzermodell mit einer Rolle. So verwalten Sie die Rolle, die ich Enum verwenden

enum professional_role: ProfessionalRole.all 

ProfessionalRole ist eine Klasse

class ProfessionalRole 
    def self.all 
    %i(altro 
     amministrazione 
     segreteria 
     buyer 
     buyer_audiovideo_consumer_electronics_home_entertainment 
     buyer_fotografia_photo 
     buyer_grandi_elettrodomestici_mda_home_confort 
     buyer_it_information_technology 
     buyer_piccoli_elettrodomestici_sda 
     buyer_telefonia_telecomunicazioni 
     capi_area 
     comunicazione_hr 
     direzione 
     marketing 
     edp) 
    end 
end 

Ich brauche einige Werte aus dem Array zu entfernen, natürlich habe ich nicht den Benutzern mit, dass die Rollen, aber das Entfernen einige Werte jede Benutzerrolle ist falsch, weil ich das Array kurz mache. Wie kann ich es lösen?

Der einzige Weg, den ich zu lösen finde, besteht darin, den Benutzer und die Rollen in einer CSV-Datei zu speichern, dann das Array zu modifizieren und jeden Benutzer mit seiner Rolle aus der CSV-Datei zu speichern.

Antwort

1

Aufzählungen werden als ganze Zahlen in der Datenbank gespeichert. Wenn Sie Enums implizit deklarieren (ohne Rails mitzuteilen, welchem ​​Integer der Wert zugeordnet werden soll), wird Rails annehmen, dass der erste Wert auf 0, der zweite Wert auf 1 und so weiter abgebildet wird. Rails ist daher Ihren Code auf die folgende Hash-Übersetzung:

{ altro: 0, amministrazione: 1, segreteria: 2, buyer: 3, 
    buyer_audiovideo_consumer_electronics_home_entertainment: 4, 
    buyer_fotografia_photo: 5, 
    buyer_grandi_elettrodomestici_mda_home_confort: 6, 
    buyer_it_information_technology: 7, 
    buyer_piccoli_elettrodomestici_sda: 8, 
    buyer_telefonia_telecomunicazioni: 9, capi_area: 10, 
    comunicazione_hr: 11, direzione: 12, marketing: 13, edp: 14 } 

Wenn Sie dann einfach eines dieser Elemente entfernen, Rails geht davon aus, dass Sie wissen, was Sie tun. Nehmen wir an, Sie entfernen altro in Ihrer enum, dann geht es davon aus, dass amministrazione auf 0 abgebildet werden sollte, was offensichtlich falsch ist. Sie möchten immer noch, dass es auf 1 abgebildet wird, aber Sie möchten 0 nicht mehr zu etwas zuordnen. Sie könnten das mit einem Suchen und Ersetzen in Ihrer Datenbank beheben und alle professional_role Spalte mit 1 dekrementieren, aber das ist obszön sehr umständlich.

Um dieses Problem zu beheben, müssen Sie Ihre Enumeration explizit deklarieren und angeben, welche Ganzzahl diesen Werten zugeordnet werden soll. Angenommen, Sie altro und segreteria und halten die anderen Zuordnungen wie vor entfernen möchten, müssen Sie Ihre Enum erklären, wie:

enum professional_role: { 
    amministrazione: 1, buyer: 3, 
    buyer_audiovideo_consumer_electronics_home_entertainment: 4, 
    buyer_fotografia_photo: 5, 
    buyer_grandi_elettrodomestici_mda_home_confort: 6, 
    buyer_it_information_technology: 7, 
    buyer_piccoli_elettrodomestici_sda: 8, 
    buyer_telefonia_telecomunicazioni: 9, capi_area: 10, 
    comunicazione_hr: 11, direzione: 12, marketing: 13, edp: 14 
} 

Wenn Sie noch Ihre ProfessionalRole Klasse verwenden möchten, einfach eine Methode hinzufügen, die die oben zurück Hash. Weitere Informationen finden Sie unter http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

0

Um ein Element aus dem ENUM-Werte-Array entfernen zu können, ohne Daten vermasseln, wandelt es in einen Hash:

{ 
    altro: 0, 
    segreteria: 2, 
    # and so on... 
    direzione: 123, 
    marketing: 200, 
} 
Verwandte Themen