2010-05-19 17 views
14

Estoy tratando de verificar si un método de búsqueda devuelve un resultado. Mi método de búsqueda es la siguiente:Comprobando si ActiveRecord find devuelve un resultado

post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1) 

¿Cuál sería una buena manera de comprobar que contiene post resultado?

+0

** Rails 3 **: http://stackoverflow.com/questions/16682699/check-if-record-exists-from-controller-in-rails/16682728#16682728 – MrYoshiji

Respuesta

23

find :all devuelve una matriz vacía ([]) si no se devuelven filas, lo que sólo puede usarlo de esta manera:

post = Post.find(:all, :conditions => { :url => params['url'] }, :limit => 1) 

unless post.empty? 
    # do something... 
end 

Por cierto, si lo hace find :all vas a obtener una matriz , ni una sola fila. Si usted está tratando de conseguir un solo mensaje, sería más limpia a los auxiliares de find_by o find :first o simplemente first lugar:

post = Post.find_by_url params['url'] 

# or 

post = Post.first :conditions => { :url => params['url'] } 

# then... 

if post 
    # do something... 
end 
+3

Un punto de interés, si solo use find() con la clave primaria (sin usar: all o: first), se genera una excepción si no se encontró nada. –

3

si después doesn' t contiene cualquier resultado, será una lista vacía y luego:

post.empty? 

devolverá verdadero.

6

Utilice BANG! versión del método find_by_url para que genere una excepción de que no se pudo encontrar y luego rescatarlo más tarde en ese mismo método/acción.

def show 
    Post.find_by_url!(params[:url]) 
    rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "The URL you were looking for could not be found." 
    redirect_to root_path 
    end 
end 

Si no lanzar una excepción aquí creo que los carriles mostraría el/404.html página pública.

+0

Más uno para ** BANG! ** – Jackson

2

puede ser tan simple como cambiar su buscador para:

post = Post.find(:first, :conditions => { :url => params['url'] }) 

Con este buscador, correo o bien devolver un solo valor o nula. Debido a cero se comporta como una declaración falsa en condiciones, se puede decir algo como lo siguiente:

if post 
    # do something 
else 
    # do something else 
end 
1
Post.find_by_id(id_column_value) 

volverá rathering nula de la voladura de su programa cuando no puede encontrar un registro.

Por supuesto, hay

x = Post.where(:any_column_name => value) 

que siempre devuelve una matriz de resultados.En cuyo caso sólo podría ejecutar un

x.each {|t| f(t) } 

o

y = x.map {|t| f(t)} 

o, por supuesto,

x[0], x[1], etc 

Lo siento, dejé llevar un poco de distancia hay

Cuestiones relacionadas