0

我正在开发一个事件应用程序,我想根据查询字符串中的 3 个参数location 或 starts_at 或 ends_at过滤事件。查询字符串中可以有任何一个、两个或所有参数。在我使用if-else语句时,我需要创建 6 个案例,这会使我的代码变得笨拙。相反,我正在考虑以这种方式实现一些东西:

class EventsController < ApplicationController
  def index
    unless params.empty?
      unless params[:location].nil?
        @events = Event.where("location = ?", params[:location])       
      end

       unless params[:starts_at].nil?
         unless @events.empty?
           @events = @events.where("start_date = ?", params[:start_date])      
         else
           @events = Event.where("Date(starts_at) = Date(?)", params[:starts_at])
         end
       end
       unless params[:ends_at].nil?
         unless @events.empty?
           @events = @events.where("end_date = ?", params[:end_date])      
         else
           @events = Event.where("Date(ends_at) = Date(?)", params[:ends_at])
         end
       end
    end
  end
end 

但是此代码不起作用,因为where查询不适用于数组。有人可以为此建议我一些解决方案吗..

4

2 回答 2

2

您应该能够将您的params哈希直接传递给where,它将根据该哈希的键和值形成正确的 SQL:

Event.where(params)

控制台中的示例:

1.9.3p194 :001 > puts Example.where(:location => 'here', :started_at => '2012-08-13').to_sql
SELECT "examples".* FROM "examples"  WHERE "examples"."location" = 'here' AND "examples"."started_at" = '2012-08-13'
于 2012-08-13T13:03:25.170 回答
0

尝试关注

  def index
    unless params.empty?
      where_array, arr = [], []
      if params[:location]
        where_array << "location = ?"
        arr << params[:location]
      end
      if params[:starts_at]
        where_array << "start_date = ?"
        arr << params[:starts_at]
      end
      if params[:ends_at]
        where_array << "end_date = ?"
        arr << params[:ends_at]
      end
       @events = arr.blank? ? [] : Event.where([where_array.join(" AND "), *arr])
    end
  end
于 2012-08-13T12:11:31.357 回答