tutorial rails crear ruby-on-rails-3

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.