variable una tipos imprimir declarar conversiones constantes alcance ruby-on-rails ruby named-scope

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.