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

时间:2017-06-29 04:33:39

标签: ruby-on-rails ruby search activerecord rails-activerecord

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

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

<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />

<script>
  function resizeIframe(obj) {
    obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

从我得到的是它找到任何空场的事件,但由于它们都没有空,它不会匹配,除非所有3个都被填满,当我试图说,看看里面的事件时出现另一个问题范围或日期数组,我对如何在搜索中传递多天感到茫然。

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

2 个答案:

答案 0 :(得分:5)

以下可能就是你要找的东西。 (注意:如果所有字段都为空白,则显示事件表中可与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?

答案 1 :(得分:3)

这将更容易和优化。如果您关注过滤器数据。

在模型中提出一个问题。

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

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