【问题标题】:Search/ filter method for all attributes in my index table我的索引表中所有属性的搜索/过滤方法
【发布时间】:2014-08-10 01:18:09
【问题描述】:

我正在尝试为我的索引表编写一行,以过滤我的对象关于特定列的特定值。我到现在为止是这样的:

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

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

【问题讨论】:

  • 您遇到了什么错误?一个搜索字段中的两个参数是什么意思?
  • 你想在这里做什么?看起来不对。 &lt;%= text_field_tag :search, params[:search], params[:search_column =&gt; title] %&gt;

标签: ruby-on-rails search params


【解决方案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}")

【讨论】:

    【解决方案2】:

    您需要 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]) %>
    

    此视图代码将显示一个select 标记,其中包含 Pimp 模型的可用列。您可以通过在 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]) %>
    

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 2021-05-14
      • 2016-03-28
      • 2013-11-25
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多