2011-06-21 15 views
8

¿Es posible crear algo más limpio de esta consulta dinámica:Creación de consultas dinámicas en función de parámetro pasado en los carriles 3

@photos = Photo.within(100, :origin => [params[:latitude], params[:longitude]]) unless (params[:latitude].nil? || params[:longitude].nil?) 

if @photos.nil? then 
    conditions = String.new 
    values  = Array.new 

    params.each_key do |key| 

    if key == 'since_id' then 
     conditions << " AND " unless conditions.length == 0 
     conditions << "id > ?" 
     values << params[key] 
    elsif key == 'user_id' then 
     conditions << " AND " unless conditions.length == 0 
     conditions << "user_id = ?" 
     values << params[key] 
    elsif key == 'id' then 
     conditions << " AND " unless conditions.length == 0 
     conditions << "id = ?" 
     values << params[key] 
    end 
    end 

    values.insert(0, conditions) 
    @photos = Photo.limit(15).order("created_at DESC").where(values) unless values.nil? 

end 

Respuesta

14

Creo que la forma correcta de hacerlo es alcances uso

scope :older_than, lambda { |value| where('id > (?)', value) if value } 
scope :with_id, lambda { |value| where('id = (?)', value) if value } 
scope :for_user, lambda { |value| where('user_id = (?)', value) if value } 

después en la búsqueda

@photos = Photo.within(100, :origin => [params[:latitude], params[:longitude]]) 
      unless (params[:latitude].nil? || params[:longitude].nil?) 

@photos = Photo.with_id(params[ :id ]) 
       .older_than(params[ :since_id ]) 
       .for_user(params[ :user_id ]) 
       .order("created_at DESC") 
       .limit(15) 
+0

Sí, lo es. Dado que no tendría sentido tener un ID como params y un since_id (deben ser mutuamente excluyentes) –

+0

La consulta que genero está bien. Lo que quiero hacer es hacerlo más bonito. Creo que es engorroso como lo planteé. Estoy buscando alternativas que lo hagan más fácil de mantener –

+0

si tengo todo lo correcto, solo 'id' o' since_id' está presente. ¿Para qué es 'Photo.within'? – Bohdan

Cuestiones relacionadas