【问题标题】:Search users by first, middle and last name按名字、中间名和姓氏搜索用户
【发布时间】:2015-07-28 07:35:21
【问题描述】:

在我的 Rails 项目中,我有一个如下所示的表:

  create_table "people", force: :cascade do |t|
    t.string   "first_name",  limit: 255
    t.string   "last_name",   limit: 255
    t.string   "middle_name", limit: 255
    t.datetime "created_at",              null: false
    t.datetime "updated_at",              null: false
  end

我有一个按名字或姓氏搜索的查询:

Person.where("lower(people.first_name) LIKE lower(:q) OR lower(people.last_name) LIKE lower(:q)", q: 'Melanie')

问题是:有没有办法重构这个查询以按名字、姓氏和中间名进行搜索?我的数据库是 Postgresql。

编辑:

当我有名字的人:比尔和姓氏:盖茨,并且当我设置“比尔盖茨”时,它不会搜索正确的记录。我想获取那条记录。

【问题讨论】:

    标签: sql ruby-on-rails postgresql activerecord


    【解决方案1】:

    你做得对。 middle_name 的另一个 OR 子句:

    Person.where("lower(people.first_name) LIKE lower(:q) OR lower(people.last_name) LIKE lower(:q) OR lower(people.middle_name) LIKE lower(:q)", q: 'Melanie')
    

    【讨论】:

    • 当我有名字的人:比尔和姓氏:盖茨,并且当我设置“比尔盖茨”时,它不会搜索正确的记录。
    • 啊!让我更新你的问题。您可以选择@Mateusz 的回答
    【解决方案2】:

    这按预期工作:

    where("lower((COALESCE(people.first_name, '') || COALESCE(people.middle_name, '') || COALESCE(people.last_name, ''))) like lower(?)", "%#{text.split.join('%')}%")
    

    【讨论】:

    • 这非常适合匹配 Rails 视图的名字和/或姓氏
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2015-08-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多