2012-06-28 18 views
5

Quiero inicializar una variable de instancia dentro de mi modelo Rails que contendrá una matriz y quiero acceder a esta variable en otros métodos dentro de mi modelo. He intentado esto:Variables de instancia en los rieles Modelo

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def statuses 
    @possible_statuses 
    end 

Pero cuando intenté lo siguiente usando los carriles de la consola:

Participant.first.statuses 

Yo he restaurado a cero :(

¿Por qué sucede esto ¿Hay una manera de lograr? lo que estoy tratando de lograr?

Respuesta

3

La mejor respuesta para mí era crear una variable de clase, no una variable de instancia:

@@possible_statuses = [ 
    'exists', 
    'paired', 
    'chat1_ready', 
    'chat1_complete' 
] 

que podrían entonces acceder libremente en los métodos de la clase:

def status=(new_status) 
    self.status_data = @@possible_statuses.index(new_status) 
    end 
+1

Si el valor de esta variable de clase va a ser constante, entonces está bien, refiérase a este http://stackoverflow.com/questions/9396563/why-should- we-avoid-using-class-variables-in-rails – Bot

10

Yo recomendaría usar una constante para este tipo de casos:

class Participant < ActiveRecord::Base 

    STATUSES = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

Si desea acceder a esa matriz de la clase en el interior, acaba de hacer STATUSES, y por el uso fuera de clase Participant::STATUSES

2

En su ejemplo, @possible_statuses es una variable de la clase en lugar de en cada instancia de el objeto. Aquí es un ejemplo bastante detallado de cómo se puede lograr esto:

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def self.possible_statuses 
    @possible_statuses 
    end 

    def possible_statuses 
    self.class.possible_statuses 
    end 

    def statuses 
    possible_statuses 
    end 

end 

como se ha mencionado en otras respuestas, si esa lista de estados nunca cambia, se debe utilizar una constante en lugar de una variable.

+0

tengo 2 modelos : Trabajo y organización. Una organización tiene_muchos trabajos, y un trabajo pertenece_ a una organización. Las organizaciones publican trabajos, deben aprobarse para poder verlos en cualquier lugar de mi aplicación. Ambos se pueden buscar (para encontrarlos alguna vez, deben ser aprobados). Lo que quiero hacer es tener una variable en mi modelo de trabajo que sea "trabajos cuya organización ha sido aprobada". Entonces, cuando escribo el método de búsqueda de trabajos, puedo tener algo como "@ approved_jobs.where ('title LIKE? And description LIKE?', Params [: search], params [: search]). Dónde y cómo harías defina la variable @approved_jobs que necesito? thx – Myna

+0

Usaría la base de datos para resolver este problema. Agregue un campo booleano aprobado a la tabla de trabajos. Luego agregue un alcance - "scope: approved, where (: approved => true)". Luego utiliza Job.approved en lugar de @approved_jobs. –

+0

La tabla de la organización tiene un booleano aprobado, y no tengo un booleano aprobado para Jobs. Si configuro un booleano para trabajos también, ¿cómo puedo decir "si una organización está aprobado, todos sus trabajos deben ser aprobados también. Y viceversa "¿usar las asociaciones y los modelos? – Myna

0

La variable de instancia solo existirá cuando cree el modelo, ya que no se está almacenando en ninguna base de datos. Querrás hacer una constante según la sugerencia de Nobita. Como alternativa, puede hacer que un módulo como ...

module Status 
    EXISTS = "exists" 
    PAIRED = "paired" 
    QUIZ_FINISHED = "quiz_finished" 
    QUIZ_RESULTS_SEEN = "quiz_results_seen" 
    MONEY_SENT = "money_sent" 

    def self.all 
    [EXISTS, PAIRED, QUIZ_FINISHED, QUIZ_RESULTS_SEEN, MONEY_SENT] 
    end 
end 

Esto le da un poco más control y flexibilidad, la OMI. Debería incluir este código anidado en su modelo.

Cuestiones relacionadas