我正在尝试在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个都被填满,当我试图说,看看里面的事件时出现另一个问题范围或日期数组,我对如何在搜索中传递多天感到茫然。
我一般都很擅长制作搜索表单,所以我甚至不知道这是否是最好的方法,我也试图在不需要特殊模型的情况下保持搜索。
答案 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
所以,这是全球解决方案。您不需要使用查询过滤器。只需在模型文件中添加此关注点即可。 这就是它。