【问题标题】:Rails Active Record Search - Name includes a wordRails Active Record 搜索 - 名称中包含一个单词
【发布时间】:2013-07-30 20:35:55
【问题描述】:

我试图从项目模型中提取所有记录,该模型在 project_name 中包含单词“Fox”。我可以进行主动记录搜索并返回特定的项目名称,例如“棕狐”:

@projects = Project.where("project_name like ?", "Brown Fox")

但如果我想返回所有包含“Fox”的名称,除非完整的项目名称是“Fox”,否则这不起作用:

@projects = Project.where("project_name like ?", "Fox")

如何进行搜索以返回名称中包含“Fox”一词的所有对象?

【问题讨论】:

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


    【解决方案1】:

    尝试使用:

    variable = "Fox"
    Project.where("project_name like ?", "%#{variable}%")
    

    【讨论】:

      【解决方案2】:

      您可以使用 SQL % 运算符:

      @projects = Project.where("project_name like ?", "%Fox%")
      

      请注意,如果您希望查询返回忽略单词大小写的结果,您可以使用 PostgreSQL ilike 而不是 like

      【讨论】:

        【解决方案3】:

        你试过ransack 吗?

        使用 ransack 你可以做类似的事情

        @projects = Project.search(:project_name_cont => "Fox")
        

        如果您认为它对您的需要来说太多了。您可以像 MurifoX 所说的那样使用 % 运算符

        【讨论】:

        • 谢谢。我现在正在调查 Ransack。
        【解决方案4】:

        这是一个允许您处理任意数量的输入单词并在一个名称中搜索所有这些单词的版本。我一直在寻找这个答案,并没有找到更复杂的情况,所以这里是:

        def self.search(pattern)
          if pattern.blank?  # blank? covers both nil and empty string
            all
          else
            search_functions = []
            search_terms = pattern.split(' ').map{|word| "%#{word.downcase}%"}
            search_terms.length.times do |i|
              search_functions << 'LOWER(project_name) LIKE ?'
            end
            like_patterns = search_functions.join(' and ')
            where("#{like_patterns}", *search_terms)
          end
        end
        

        【讨论】:

          猜你喜欢
          • 2012-12-07
          • 2018-05-08
          • 1970-01-01
          • 2011-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多