控制器查询中的可选Rails参数

时间:2014-03-06 15:04:35

标签: ruby-on-rails params

我对Rails params有疑问。我目前在我的一个视图上只有一个过滤器,允许用户按日期范围过滤数据。我在该视图中添加了两个过滤器,以便用户可以按代码和国家/地区进行过滤。但是,我希望这些过滤器是可选的。

我当前的查询看起来像这样:

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

代码和国家的参数类似于,params [:code]和params [:country]。我想把它们放在查询中:

  @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 [:code]和params [:country]输入任何内容,我会收到错误,因为它们是零。有关如何处理这种情况的任何想法?

3 个答案:

答案 0 :(得分:1)

我会逐渐建立它:

@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]之前错过了两个逗号,我在上面的代码中修复了这些逗号。

答案 1 :(得分: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])

无论如何,我会将复杂的查询移动到命名范围或游戏模型中的某些内容。

编辑:添加“范围”方法,我不确定是否需要,如果你想要的话,不用.scoped尝试

答案 2 :(得分: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])