2011-06-21 2 views
8

に渡されたパラメータに応じて、動的なクエリを作成すると、それは、このダイナミッククエリのうち、クリーンなものを作成することは可能です:がレール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 

答えて

14

私はそれを行うための正しい方法は、使用スコープ

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 } 
だと思います

後で検索する

@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

はいです。 paramsとsince_idというIDを持つことは意味がないので(相互排他的でなければなりません) –

+0

生成するクエリはOKです。私がやりたいことはそれをもっときれいにすることです。私はそれをレイアウトした方法が面倒だと思います。私は、 'id'または' since_id'だけが存在すれば、より保守性の高い代替手段を探しています。 –

+0

'Photo.within'とは何ですか? – Bohdan