ruby-on-rails - una - imprimir variables ruby
¿Es posible negar un alcance en Rails 3? (3)
Tengo el siguiente ámbito para mi clase llamada Collection
:
scope :with_missing_coins, joins(:coins).where("coins.is_missing = ?", true)
Puedo ejecutar Collection.with_missing_coins.count
y obtener un resultado, ¡funciona muy bien! Actualmente, si quiero obtener colecciones sin perder monedas, agrego otro alcance:
scope :without_missing_coins, joins(:coins).where("coins.is_missing = ?", false)
Me encuentro escribiendo muchos de estos ámbitos "opuestos". ¿Es posible obtener el opuesto de un alcance sin sacrificar la legibilidad o recurrir a un lambda / método (que toma true
o false
como parámetro)?
Algo como esto:
Collection.!with_missing_coins
En Rails 4.2, puedes hacer:
scope :original, -> { ... original scope definition ... }
scope :not_original, -> { where.not(id: original) }
Se utilizará una subconsulta.
No hay una "reversión" de un alcance per se, aunque no creo que recurrir a un método lambda sea un problema.
scope :missing_coins, lambda {|status|
joins(:coins).where("coins.is_missing = ?", status)
}
# you could still implement your other scopes, but using the first
scope :with_missing_coins, lambda { missing_coins(true) }
scope :without_missing_coins, lambda { missing_coins(false) }
entonces:
Collection.with_missing_coins
Collection.without_missing_coins
No usaría un solo alcance para esto, pero dos:
scope :with_missing_coins, joins(:coins).where("coins.is_missing = ?", true)
scope :without_missing_coins, joins(:coins).where("coins.is_missing = ?", false)
De esa manera, cuando se utilizan estos ámbitos, entonces es explícito lo que está sucediendo. Con lo que sugieren los números 1311407, no queda claro de inmediato qué está haciendo el argumento false
de with_missing_coins
.
Debemos tratar de escribir el código lo más claro posible y si eso significa ser menos fanáticos de DRY una vez, entonces, así sea.