搜索/过滤索引表中所有属性的方法

时间:2014-06-19 13:20:43

标签: ruby-on-rails search params

我正在尝试为我的索引表编写一行,用于过滤关于特定列的特定值的对象。我到现在所拥有的是:

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] %>

但它不起作用。我得到一个错误消息,我想在一个搜索字段中传递这两个参数。你会怎么做?

2 个答案:

答案 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]) %>