我对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]输入任何内容,我会收到错误,因为它们是零。有关如何处理这种情况的任何想法?
答案 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])