Enumeración de los atributos son grandes y me quiere hacer uso de ellos. Pero la asignación de los valores enum a entero sería difícil mantener tanto el código y la base de datos. También mi base de datos sería altamente junto con mi código que creo que debería considerar la posibilidad de que una mala cosa.

Sé que puedo utilizar un hash para organizar una enumeración de atributos con los pares clave/valor, pero todavía sería mucho mejor para ser capaz de utilizar una matriz y el mapa de la cadena de valores en la base de datos.

Hay alguna forma de mapa enumeración de las cadenas por defecto?

OriginalEl autor Eren CAY | 2014-06-08

5 Comentarios

  1. 8

    Que yo sepa no es posible con el Registro integrado en la enumeración funcionalidad. Sin embargo, hay un par de populares 3ª parte de las joyas que hacer esto. La coincidencia más cercana a lo que viene con el Registro son probablemente enumerize y SimpleEnum.

    Sin embargo, si usted está buscando algo un poco diferente, me gustaría recomendar ClassyEnum (revelación completa: lo escribí). Aquí están algunas de mis notas en la diferencia entre enumerize y SimpleEnum vs ClassyEnum:

    Clase-menos enumeraciones (enumerize, SimpleEnum) son ideales para un uso sencillo
    los casos donde sólo se necesita un campo para representar a uno de un conjunto fijo de
    valores. El principal problema que tengo con esta solución es que alienta a los
    condicionales dispersos a lo largo de sus modelos, controladores y vistas.
    Es tentador utilizar estas gemas porque son las más sencillas
    implementar, pero el largo plazo la rentabilidad no sólo es de allí de la OMI para nada
    pero los casos más simples.

    ClassyEnum fue diseñado para resolver el problema de tener dispersos
    lógica condicional en relación con los diferentes enumeraciones. Todavía se puede utilizar
    por simple colecciones que no tienen lógica, pero cuando usted los necesita para
    agregar la lógica (y casi seguro que lo hará), usted puede empujar a que en el
    individual enum clases y tomar ventaja de polimorfismo.

    OriginalEl autor Peter Brown

  2. 21

    Mirar el código para el enum, usted puede hacer esto (al menos en 4.1+): https://github.com/rails/rails/blob/master/activerecord/lib/active_record/enum.rb#L96-98 por el paso de un hash, por ejemplo:

    class Foo
      enum name: {
        foo: 'myfoo',
        bar: 'mybar'
      }

    Aunque con resultados inesperados cuando se accede a él, a ver https://github.com/rails/rails/issues/16459

    foo_instance.foo!
    foo_instance.name
    => "foo"
    foo_instance[:name]
    => "myfoo"

    Actualización

    Este problema se corrigió en Rails 5, ver https://github.com/rails/rails/commit/c51f9b61ce1e167f5f58f07441adcfa117694301. Gracias Yuri.

    OriginalEl autor Mihai Târnovan

  3. 5

    Parece que con Rieles de 5 API sólo una enumeración de atributos de un modelo de guardar en la base de datos de como entero, sino que será publicada en la API pública como una cadena (con ActiveModel::Serializador).

    Por ejemplo,

    Modelo de artículo:

    class Article < ApplicationRecord
      enum status: [ :visible, :hidden ]
    end

    Artículo serializador:

    class ArticleSerializer < ActiveModel::Serializer
      attributes :id, :status, :title, :body
    end

    Va a publicar el siguiente json:

    {
      "id": "1",
      "type": "articles",
      "attributes": {
        "status": "visible",
        "title": "Enums are passed as string in a json API render",
        "body": "Great!",
    }

    OriginalEl autor Benjamin J. Benoudis

  4. 5

    Cómo sobre:

    class Foo < ApplicationRecord
      NAMES = [
        :foo,
        :bar
      ]
    
      enum names: NAMES.zip(NAMES).to_h
    end

    OriginalEl autor Jay Quigley

  5. 4

    La respuesta corta es no. Usted tendrá que usar una gema (como la magia de enum) si usted quiere hacer algo pero almacenar números enteros.

    En DHH propias palabras en esto de los comentarios en el pull request que añadió esta característica:

    Es bastante ineficiente para almacenar las enumeraciones como texto. Vas a repetir el mismo texto una y otra y otra vez. Me gustaría considerar que un anti patrón. La gente está mejor haciendo una migración a ints si quieren usar esta.

    DHH también dijo: «yo estaría feliz de ver esta respaldado por la base de datos de las enumeraciones.», que es más cercana a la utilización de cadenas de enteros. No estoy seguro si nada sucediera con que a pesar de.
    DHH tiene un punto, pero yo no lo consideraría el uso de ambigua y difícil de mantener enteros mejor luego repetir la misma significativos y de fácil mantenimiento – cuerdas una y otra vez.
    almacenar una cadena que no está tan lejos fuera de la base de considerar que los valores booleanos son a menudo se almacenan como un personaje.
    Ja! Él es tan hipócrita. ¿Por qué no DHH implementar entero-copia de Polimórficos Asociaciones de entonces? type: 'CompanyAddress' toma una mierda toneladas de espacio…

    OriginalEl autor pdobb

Dejar respuesta

Please enter your comment!
Please enter your name here