2012-09-11 10 views
16

Viene visualizzato questo errore durante l'accesso agli ambiti.metodo non definito `default_scoped? ' durante l'accesso allo scope

Ecco modello AR

class StatisticVariable < ActiveRecord::Base 
    attr_accessible :code, :name 

    has_many :statistic_values 

    scope :logins, where(code: 'logins').first 
    scope :unique_logins, where(code: 'unique_logins').first 
    scope :registrations, where(code: 'registrations').first 

end 

e quando provo con StatisticVariable.logins o altri scopi dà:

NoMethodError: undefined method `default_scoped?' 

Se configuro portata come metodo di classe allora funziona perfettamente.

def self.registrations 
    where(code: 'registrations').first 
end 

Per favore guidami a capire e risolvere questo problema.

risposta

27

I cosiddetti scopes non sono ambiti: non sono concatenabili.

Immagino che Rails cerchi di aggiungere un potenziale default_scope al risultato che porta al fallimento.

fare qualcosa di simile:

scope :logins, where(code: 'logins') 
    scope :unique_logins, where(code: 'unique_logins') 
    scope :registrations, where(code: 'registrations') 

    def self.login 
    logins.first 
    end 
+0

Ah, grazie per questo! L'ho ottenuto cambiando l'ordine di default_scope: "foo" 'a' default_scope {{order: "foo"}} '. Risolto modificandolo in 'default_scope {order (" pippo ")}'. –

0

ho ottenuto questo errore perché uno dei miei scopi stava tornando self, che io pensavo fosse l'oggetto relazione (non ha funzionato); restituendo nil invece raggiunto il risultato atteso. es .:

scope :except_ids, -> ids do 
    if ids.present? 
    ids = ids.split(',') if ids.respond_to?(:split) 
    where('id not in (?)', ids) 
    end 
end 

se ids.present? restituisce false, la condizione restituisce nil e l'ambito non ha alcun effetto, ma è ancora concatenabile.