2012-03-05 10 views
9

Nel mio modello Rails3 ho questi due ambiti di nome:È possibile invertire un ambito con nome in Rails3?

scope :within_limit,  where("wait_days_preliminary <= ? ", ::WAIT_TIME_LIMIT.to_i) 
scope :above_limit,  where("wait_days_preliminary > ? ", ::WAIT_TIME_LIMIT.to_i) 

Sulla base della loro somiglianza, sarebbe naturale per me per definire la seconda invertendo il primo.

come posso farlo in Rails?

risposta

10

Arel ha un metodo not si potrebbe usare:

condition = arel_table[:wait_days_preliminary].lteq(::WAIT_TIME_LIMIT.to_i) 
scope :within_limit, where(condition)  # => "wait_days_preliminary <= x" 
scope :above_limit, where(condition.not) # => "NOT(wait_days_preliminary <= x)" 
+0

intelligente! Anche se la tua risposta suggerisce che non posso definire il primo e quindi "non" il primo ambito in questo modo: 'scope: above_limit, within_limit.not' –

1

credo che questo potrebbe funzionare

scope :with_limit, lambda{ |sign| where("wait_days_preliminary #{sign} ? ", ::WAIT_TIME_LIMIT.to_i) } 

MyModel.with_limit(">") 
MyModel.with_limit("<") 
MyModel.with_limit(">=") 
MyModel.with_limit("<=") 
Problemi correlati