2011-06-21 11 views
8

Czy to możliwe, aby stworzyć coś czystszego z tego dynamicznego zapytania:Tworzenie dynamicznych zapytań w zależności od parametru przeszedł w szynach 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 

Odpowiedz

14

myślę właściwy sposób, aby to zrobić, to użyć lunety

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 } 

później w wyszukiwaniu

@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

Tak jest. Ponieważ nie ma sensu mieć id jako params i since_id (powinny one wzajemnie się wykluczać) –

+0

Zapytanie, które generuję, jest OK. Chcę zrobić to ładniej. Myślę, że to nieporęczne, jak to ułożyłem. Szukam alternatyw, które sprawiłyby, że byłaby łatwiejsza w utrzymaniu –

+0

, jeśli wszystko jest w porządku, tylko "id" lub "since_id" jest obecne. Do czego służy funkcja "Photo.within"? – Bohdan

Powiązane problemy