我正在尝试为我的索引表编写一行,用于过滤关于特定列的特定值的对象。我到现在所拥有的是:
pimps_controller.rb
:
def index
@pimps = Pimp.search(params[:search])
end
pimp.rb
:
def self.search( search)
if search
where('title LIKE ?', "%#{search}%")
else
scoped
end
end
观点的一部分:
<%= text_field_tag :search, params[:search] %>
仅在对象标题之后进行过滤,因此我尝试对其进行更改以使其适用于可以在不同属性之后进行过滤的不同搜索字段。如果有人触发搜索功能以确保它触发正确的属性,我想传递第二个参数值。这就是我尝试过的:
pimps_controller.rb
@pimps = Pimp.search(params[:search_column],params[:search])
pimp.rb
:
def self.search(search_column, search)
if search
col = "%#{search_column}"
s = "%#{search}%"
where(col 'LIKE ?', s)
else
scoped
end
end
观点:
<%= text_field_tag :search, params[:search], params[:search_column => title] %>
但它不起作用。我得到一个错误消息,我想在一个搜索字段中传递这两个参数。你会怎么做?
答案 0 :(得分:1)
这是一个关于如何做的简单教程:
https://we.riseup.net/rails/simple-search-tutorial
在模型中,您必须在查询中添加带或条件的字段。
def self.search(search)
search_condition = "%" + search + "%"
find(:all, :conditions => ['title LIKE ? OR description LIKE ?', search_condition, search_condition])
end
如果要定义要在参数中搜索的字段,可以使用带简单引号的字符串插值:
%q(文字包含“#{search.query}”)
答案 1 :(得分:0)
您需要2个文本字段,一个用于列,一个用于值:
# view
<%= text_field_tag :search_value, params[:search_value] %>
<%= text_field_tag :search_column, params[:search_column] %>
# controller
@pimps = Pimp.search(params[:search_column], params[:search_value])
# Pimp model
def self.search(search_column, search_value)
if search_value.present? && search_column.present?
column = self.column_names.include?(search_column.to_s) ? search_column : 'title'
value = "%#{search_value}%"
where("#{self.table_name}.#{column} LIKE ?", value)
else
scoped
end
end
此方法存在的问题是,如果您没有输入列的确切名称,它将搜索列title
中的值。我认为你应该使用select_tag
,列出模型的所有可搜索列:
# view
<%= select_tag :search_column, options_for_select(Pimp.column_names.map { |col| [col, col] }, params[:search_column]) %>
此视图代码将显示带有Pimp模型可用列的select
标记。您可以通过在Pimp上定义类方法来轻松限制可搜索列:
# Pimp model
def searchable_columns
self.column_names - ['id', 'created_at', 'updated_at']
end
# view
<%= select_tag :search_column, options_for_select(Pimp.searchable_columns.map { |col| [col, col] }, params[:search_column]) %>