在Rails中构建一个简单的搜索表单?

我正在尝试在Ruby on Rails中构建一个简单的搜索表单,我的表单很简单,基本上你从一系列选项中选择字段,然后显示匹配字段的所有事件。 当我将任何字段留空时问题就出现了。

以下是负责过滤参数的代码

Event.joins(:eventdates).joins(:categories).where ("eventdates.start_date = ? AND city = ? AND categories.name = ?", params[:event][:date], params[:event][:city], params[:event][:category]).all 

从我得到它是它寻找具有任何空字段的事件,但由于它们都没有空,它不会匹配,除非所有3都被填充,当我试图说,在范围或数组内查看事件时出现另一个问题日期,我对如何通过多天进入搜索毫无头绪。

我一般都很擅长制作搜索表单,所以我甚至不知道这是否是最好的方法,我也试图在不需要特殊模型的情况下保持搜索。

以下可能是您正在寻找的。 (注意:如果所有字段都为空,则显示事件表中可与eventdates和类别链接的所有数据。)

 events = Event.joins(:eventdates).joins(:categories) if params[:event] # includes below where condition to query only if params[:event][:date] has a value events = events.where("eventdates.start_date = ?", params[:event][:date]) if params[:event][:date].present? # includes below where condition to query only if params[:event][:city] has a value events = events.where("city = ?", params[:event][:city]) if params[:event][:city].present? # includes below where condition to query only if params[:event][:city] has a value events = events.where("categories.name = ?", params[:event][:category]) if params[:event][:category].present? end 

要使用多天搜索:

 # params[:event][:dates] is expected to be array of dates. # Below query gets converted into an 'IN' operation in SQL, something like "where eventdates.start_date IN ['date1', 'date2']" events = events.where("eventdates.start_date = ?", params[:event][:dates]) if params[:event][:dates].present? 

它将更容易和优化。 如果您关注filter数据。

在模型中提出一个问题。

filterable.rb

 module Filterable extend ActiveSupport::Concern module ClassMethods def filter(filtering_params) results = self.where(nil) filtering_params.each do |key, value| if column_type(key) == :date || column_type(key) == :datetime results = results.where("DATE(#{column(key)}) = ?", Date.strptime(value, "%m/%d/%Y")) if value.present? else results = results.where("#{column(key)} Like ? ", "%#{value}%") if value.present? end end results end def resource_name self.table_name end def column(key) return key if key.split(".").count > 1 return "#{resource_name}.#{key}" end def column_type(key) self.columns_hash[key].type end end end 

在要筛选的模型文件中包含此问题。

Model.rb

  include Filterable 

在您的控制器中添加此方法

 def search @resources = Model.filter(class_search_params) render 'index' end def class_search_params params.slice(:id,:name) #Your field names end 

所以,这是全球解决方案。 您不需要使用查询filter。 只需在模型文件中添加此关注点即可。 而已。