2011-09-16 10 views
5

Soy nuevo en los rieles y esto puede parecer obvio, pero no pude encontrar una respuesta..where vs find. ActiveRecord :: Relation NoMethodError

cuando lo hago

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

no funciona me siguen dando

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

pero si cambio

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

a

u = User.find_by_email(email_string) 

puedo ver que mis cambios se mantienen y no se produce ningún error.

Entonces, ¿qué es lo que me falta? ¿Es eso . where devuelve un objeto de solo lectura o algo así?

+0

ninguna experiencia de esta tecnología en absoluto, pero mi suposición es que 'where' devuelve una colección/matriz donde' 'find_by_email' devuelve un solo registro? –

Respuesta

17

.where es en realidad un ámbito y de hecho devuelve una colección de usuarios y ni uno solo. Se puede obtener el primer usuario coincidente (como se hace .find_by_email) con

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

Además, puede devolver una colección con

User.find_all_by_email(email_string) 

espero que esto ayude.

+0

gracias Mosch, eso tiene sentido ahora. – user368005

+1

Sé que esta pregunta es específicamente para rails-3, pero para cualquier persona que intente esto en rails-4 etc., el buscador dinámico 'find_all_by _...' ha quedado en desuso y la nueva sintaxis es 'find_by email: 'email_string'' https: //github.com/rails/activerecord-deprecated_finders – waffl

Cuestiones relacionadas