ruby-on-rails-3 - crear - rails jobs
¿Cómo hacer condicional un alcance dinámico de Rails 3? (1)
Me gustaría hacer que un ámbito con nombre dinámico en los rieles 3 esté condicionado a los argumentos pasados. Por ejemplo:
class Message < AR::Base
scope :by_users, lambda {|user_ids| where(:user_id => user_ids) }
end
Message.by_users(user_ids)
Sin embargo, me gustaría poder llamar a este ámbito incluso con una matriz vacía de user_ids, y en ese caso no aplicar el donde. La razón por la que quiero hacer esto dentro del alcance es que voy a encadenar varios de estos juntos.
¿Cómo hago este trabajo?
Para responder a tu pregunta puedes hacer:
scope :by_users, lambda {|user_ids|
where(:user_id => user_ids) unless user_ids.empty?
}
sin embargo
Normalmente solo uso el scope
para operaciones simples (para facilitar la lectura y el mantenimiento), cualquier cosa después de eso y solo uso métodos de clase, así que
class Message < ActiveRecord::Base
def self.by_users(users_id)
if user_ids.empty?
scoped
else
where(:user_id => users_id)
end
end
end
Esto funcionará en Rails 3 porque where
realidad devuelve un ActiveRecord::Relation
, en el que puede encadenar más consultas.
También estoy usando #scoped
, que devolverá un ámbito anónimo, lo que le permitirá encadenar consultas.
Al final, depende de ti. Solo te estoy dando opciones.