Tengo una aplicación en la cual necesito obtener siempre los objetos
en base a una condición dinámica, algo como esto:
class Recinto < ActiveRecord::Base
has_many :sesiones, :conditions => [fecha > ?, Time.now]
has_many :espectaulos, :through => sesiones
end
El problema de hacerlo asà es que la condición se fija en el momento
de carga de la clase y luego no se vuelve a evaluar.
He estado mirando la opción with_scope, asà como algunos plugins que
la usan pero siempre me encuentro con el mismo problema con las
condiciones dinámicas.
Supongo que siempre queda la alternativa de hacer un before_filter,
evaluar la condición y pasarla, pero me parece farragoso.
El problema de hacerlo así es que la condición se fija en el momento
de carga de la clase y luego no se vuelve a evaluar.
He estado mirando la opción with_scope, así como algunos plugins que
la usan pero siempre me encuentro con el mismo problema con las
condiciones dinámicas.
Supongo que siempre queda la alternativa de hacer un before_filter,
evaluar la condición y pasarla, pero me parece farragoso.
¿Cual sería la forma más DRY de hacer ésto?
Yo haría algo
así:
class Recinto < ActiveRecord::Base
has_many :sesiones
has_many :espectaulos, :through => :sesiones
def sesiones_futuras
sesiones.find(:all, :conditions => [“fecha > ?”, Time.now])
end
end
También tendrías que hacer algo parecido para los espectáculos, claro.
Tengo una aplicación en la cual necesito obtener siempre los objetos
en base a una condición dinámica, algo como esto:
class Recinto < ActiveRecord::Base
has_many :sesiones, :conditions => [fecha > ?, Time.now]
has_many :espectaulos, :through => sesiones
end
Eduardo, qué pasa si hacés esto:
class Recinto < ActiveRecord::Base
has_many :sesiones, :conditions => 'fecha > ‘#{Time.now.to_s(:db)}’
has_many :espectaulos, :through => sesiones
end
Ojo, que las comillas son simples, justamente porque no querés que se
evalúe en la definición de la clase. Estoy casi seguro que una vez
anduvo…
Sergio, creo que lo que decís se podría hacer
así:
class Sesion < AR::Base
class << self
def futuras
find(:all, :conditions => [“fecha > ?”, Time.now])
end
end
end
El problema de esta aproximacion es que esa linea invoca un metodo de
clase que se ejecuta al interpretar la definicion, por tanto una sola
vez en la vida de la clase.
Debido a ello, la definicion de la relacion se queda con ese valor
“cacheado” ya que se interpola la cadena al ejecutarse el metodo.
Esto en desarrollo puede que no se vea porque la clase se recarga por
request, pero en produccion no funcionaria.
Esto en desarrollo puede que no se vea porque la clase se recarga por
request, pero en produccion no funcionaria.
Xavier, justamente por eso puse las comillas simples, no las dobles.
Lo que me pasó es que lo probé una vez y me anduvo, como si el valor
de :conditions fuese evaluado al construir la consulta.
Debido a ello, la definicion de la relacion se queda con ese valor
“cacheado” ya que se interpola la cadena al ejecutarse el metodo.
Esto en desarrollo puede que no se vea porque la clase se recarga por
request, pero en produccion no funcionaria.
Xavier, justamente por eso puse las comillas simples, no las dobles.
Lo que me pasó es que lo probé una vez y me anduvo, como si el valor
de :conditions fuese evaluado al construir la consulta.
Ah, ok, como en general la evaluacion de codigo con eval es inusual,
la cadena no estaba cerrada, y el SQL de dentro tenia comillas
simples, pense que la de afuera era en realidad doble.