Rails opsommingen: String of Integer kolom?

Ik ben momenteel op zoek naar een juiste Rails-edelsteen voor opsommingen.

Ik heb het al geprobeerd

  • enum_simulator
  • has_enum

    1. Both use a string column in the database to store the enum data. Wouldn't an integer column have a better performance or less storage consumption (using MySQL)?
    2. Is there a gem out there that can already do this?

Hartelijk bedankt!

Update: I found the simple_enum gem which uses integer values to represent the enum within the database. It supports rails 3.1 and is well maintained.

4

2 antwoord

Ruby Toolbox is your friend. https://www.ruby-toolbox.com/categories/Active_Record_Enumerations

Ik heb enumerated_attribute gebruikt met zowel Rails 2.3 als Rails 3 met goede resultaten. Ja, het gebruikt een stringkolom.

IMO-tekenreeksen zijn beter dan kolommen met gehele getallen omdat ze geen waardenvolgorde impliceren en het attribuut gemakkelijker te begrijpen maken (reverse-engineer, als u dat wilt) zonder naar de broncode te kijken. En meestal is het verschil in prestaties verwaarloosbaar, vooral als u een index op het veld hebt - en dat zou u ook moeten doen.

Het gebruik van het MySQL enum veld is ingewikkeld gebleken in Rails 2.3, problemen met schema's, niet zeker of het blijft bestaan ​​in Rails 3.

4
toegevoegd
@alex, ik denk het niet, want dat is waar enum voor is. Vergeet niet om te stemmen, trouwens.
toegevoegd de auteur Leonid Shevtsov, de bron
Hartelijk bedankt! ik zal er eens naar kijken. Weet u of MYSQL de gegevens van een kolom met strings comprimeert als er veel overtollige waarden uit de opsomming zijn?
toegevoegd de auteur alex, de bron
oke bedankt ... ik zal wat verder onderzoek doen. Het spijt me, maar ik heb momenteel niet genoeg reputatie om op te halen-stemmen, maar ik zal het zeker zo snel mogelijk doen.
toegevoegd de auteur alex, de bron
Ik kan bevestigen dat MySQL enum nog steeds niet wordt ondersteund in Rails 3
toegevoegd de auteur Paweł Obrok, de bron

Zoek naar dit juweeltje: enumerate_it . Ik denk dat het je probleem oplost!

0
toegevoegd