【问题标题】:Help me get this search query right帮助我正确获取此搜索查询
【发布时间】:2011-08-11 10:01:06
【问题描述】:

我的 users 表有一个 first_namelast_name 列,name 是一个虚拟属性。例如我有这些记录:

Aen Tan
Lily Chou Chou
Nuon Baby

当我用两个词搜索时,我得到了预期的结果:

"aen tan" Aen Tan
"lily chou" Lily Chou Chou

但是当我用一个词搜索时,例如“aen”我得到了所有三个记录。

这是我的查询:

scope :find_by_name, lambda {|name| where("first_name LIKE ? or last_name LIKE ?",  '%' + name.split(' ').first + '%', '%' + name.split(' ')[1, name.split(' ').length-1].join(' ') + '%')}

当我用一个词“aen”搜索时,它会产生这个SQL:

SELECT `users`.* FROM `users` WHERE (first_name LIKE '%aen%' or last_name LIKE '%%')

我认为问题在于姓氏为空。有什么好的解决方法?如果只给出一个词,我应该用这个词搜索两列吗?

这让我想到了我正在思考的其他事情。如果我搜索“tan+aen”,我将一无所获,但绝对有可能用户会颠倒名称的顺序。如何构建一个考虑到这一点的查询?

【问题讨论】:

    标签: sql ruby-on-rails ruby search


    【解决方案1】:

    你可以将作用域作为一个函数来做这样的事情。这会假设名称只有 2 个单词。

    def self.find_by_name(name)
      names = split(' ')
      if names.size == 1
        YourModel.where("first_name LIKE ?", "%#{names.first}%")
      else
        YourModel.where("first_name LIKE ? AND last_name LIKE ?", "%#{names.first}%")
      end
    end
    

    更好的解决方法是拥有一个可以搜索的 full_name 表属性。这很容易在您的模型上创建后构建。

    那么你的范围就是:

    scope :find_by_name, {|name| where("full_name LIKE ?", "%#{name}%")}
    

    【讨论】:

      【解决方案2】:

      你可以:

      • 如果查询搜索中没有第二个单词,则不搜索 last_name
      • 将您的条件放入AND 条件而不是OR。我猜您会搜索具有 both 名字 AND 姓氏与您的查询匹配的用户。

      【讨论】:

        【解决方案3】:
        SELECT users.* FROM users WHERE (first_name LIKE '%Aen%' And last_name LIKE '%%')
        

        我认为这是解决方案。我试过了,它给出了你想要的相同结果....希望有帮助

        【讨论】:

          猜你喜欢
          • 2019-08-24
          • 2011-03-03
          • 2014-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-28
          • 2011-04-05
          • 2011-04-05
          相关资源
          最近更新 更多