2010-12-13 9 views
25

mi sento come questo è un semplice problema che sto avendo a causa della mia incomprensione della nuova interfaccia di query ActiveRecord, ma prendere questo esempio:Rails 3, interrogare Active Record restituisce oggetto ActiveRecord :: Relation, invece di oggetti

>> Category.first.recipes 
=> [ ... ] # array of recipes 

Tuttavia:

>> Category.where(:id => 1).recipes 
=> NoMethodError: undefined method `recipes' for #<ActiveRecord::Relation:0x000001033dc9e0> 

cosa sta succedendo qui? perché il mio metodo where restituisce un oggetto ActiveRecord::Relation? come posso recuperare gli oggetti dalla query qui?

risposta

42

Questo è effettivamente intenzionale.

Category.where(:id => 1) 
# Is Equivalent to Category.all(:conditions => {:id => 1}}) 
Category.where(:id => 1).first 
# Is equivalent of Category.first(:conditions => {:id => 1}}) 

Gli oggetti vengono recuperati solo quando vengono chiamati metodi speciali come primo, ecc. Questo è chiamato caricamento lento, che è un grande quando si desidera memorizzare le viste in cache. Ulteriori informazioni sul motivo here.

+4

voto negativo perché non equivalente. 'where' restituisce ActiveRecord :: Relation, mentre il resto restituisce Array o Model.class –

+2

È equivalente nel contesto. Questo è il motivo per cui ho menzionato il caricamento pigro. Ma sì, '.where.all' sarebbe equivalente. – Swanand

6
Category.where(:id => 1).recipes 

Restituisce un array. Se fai semplicemente Category.where(:id => 1).first.recipes dovrebbe funzionare.

3

Ma se si sta solo facendo un punto contraria all'ID, utilizzare il metodo di ricerca Category.find(1) restituirà un oggetto Categoria.
Quindi:
Category.find(1).recipes

Problemi correlati