2014-03-06 19 views
0

我有一个关于Rails参数的问题。我目前只有一个过滤器,允许用户按日期范围过滤数据。我在该视图中添加了两个更多的过滤器,以便用户可以按代码和国家进行过滤。不过,我希望这些过滤器是可选的。控制器查询中的可选Rails参数

我当前的查询看起来是这样的:[:代码],而params [:国家]

@data = Games 
     .where("date BETWEEN ? AND ?", *date_range_array) 
     .includes(:synced_country) 
     .order(sort_column + " " + sort_direction) 
     .page(params[:page]) 

代码和国家将会像,则params的PARAMS。我希望把他们像查询:

@data = Games 
      .where("date BETWEEN ? AND ?", *date_range_array) 
      .where("unique_code in ?" params[:code]) 
      .where("country in ?" params[:country]) 
      .includes(:synced_country) 
      .order(sort_column + " " + sort_direction) 
      .page(params[:page]) 

我遇到的问题是,如果用户确实为PARAMS不输入任何东西[:代码],而params [:国]我得到一个错误,因为他们是零。有关如何处理这种情况的任何想法?

回答

0
@data = Games.where("date BETWEEN ? AND ?", *date_range_array).scoped 
@data = @data.where("unique_code in ?" params[:code]).scoped if params[:code].present? 
@data = @data.where("country in ?" params[:country]).scoped if params[:coutry].present? 
@data = @data.includes(:synced_country) 
      .order(sort_column + " " + sort_direction) 
      .page(params[:page]) 

无论如何,我会将该复杂的查询移动到游戏模型中的命名范围或其他东西。

编辑:添加了“作用域”的方法,我不知道如果需要的话,尝试没有,如果你想

+0

或查询对象 - 我喜欢那些! – sevenseacat

0

我会逐步建立它.scoped:

@data = Games.where("date BETWEEN ? AND ?", *date_range_array) 

@data = @data.where("unique_code in ?", params[:code]) if params[:code] 
@data = @data.where("country in ?", params[:country]) if params[:country] 

@data = @data.includes(:synced_country) 
      .order(sort_column + " " + sort_direction) 
      .page(params[:page]) 

需要注意的是在params[:code]params[:country]之前丢失了两个逗号,我已经在上面的代码中修复了这两个逗号。

0

我通常使用与Agis相同的方法。 但有时我趋向于使用范围(如arieljuod说):

class Games 

    scope :in_contry, lambda{|contry| where("contry in ?", contry) if contry.present?} 

    scope :in_code, lambda{|code| where("unique_code in ?", code) if code.present?} 

    //other codes 
end 

//call lambdas as follows: 
@data = Games.where("date BETWEEN ? AND ?", *date_range_array) 
      .in_code(params[:code]) 
      .in_contry(params[:country]) 
      .includes(:synced_country) 
      .order(sort_column + " " + sort_direction) 
      .page(params[:page])