2011-09-16 16 views
5

Sono nuovo per le rotaie e questo potrebbe sembrare ovvio, ma non ho potuto trovare una risposta.. Where vs find. ActiveRecord :: Relation NoMethodError

quando faccio

u = User.where("email=?", email_string) 
u.name = "new name" 

non funziona continuo a ricevere

NoMethodError: undefined method `name=' for #<ActiveRecord::Relation:0x1049c2890> 

ma se cambio

u = User.where("email=?", email_string) 

a

u = User.find_by_email(email_string) 

posso vedere le mie modifiche persiste e nessun errore lanciato.

Quindi cosa mi manca. è quello . dove restituisce un oggetto di sola lettura o qualcosa del genere?

+0

nessuna esperienza di questa tecnologia, ma la mia ipotesi è che 'where' sta restituendo una raccolta/matrice in cui' find_by_email' restituisce un singolo record? –

risposta

17

. Ovunque sia effettivamente un ambito e restituisce effettivamente una raccolta di utenti e non una singola. È possibile ottenere il primo utente corrispondente (come .find_by_email fa) con

User.where('email = ?', email_string).first 

Inoltre, è possibile restituire un insieme con

User.find_all_by_email(email_string) 

Spero che questo aiuta.

+0

grazie Mosch, ha senso ora. – user368005

+1

So che questa domanda è specifica per rails-3, ma per chiunque provi questo su rails-4 ecc., Il finder dinamico 'find_all_by _...' è stato deprecato e la nuova sintassi è 'find_by email: 'email_string'' https: //github.com/rails/activerecord-deprecated_finders – waffl

Problemi correlati