8

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

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

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

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

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

4

4 回答 4

11

尝试使用:

variable = "Fox"
Project.where("project_name like ?", "%#{variable}%")
于 2013-07-30T20:44:14.597 回答
1

您可以使用 SQL%运算符:

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

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

于 2013-07-30T20:40:00.347 回答
1

你试过洗劫吗?

用 ransack 你可以做类似的事情

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

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

于 2013-07-30T20:49:57.220 回答
1

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

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
于 2019-03-18T13:47:50.737 回答