在我的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
我有一个通过first_name或last_name搜索的查询:
Person.where("lower(people.first_name) LIKE lower(:q) OR lower(people.last_name) LIKE lower(:q)", q: 'Melanie')
问题是:有没有办法重构此查询以通过first_name,last_name和middle_name进行搜索?我的数据库是Postgresql。
修改
当我有第一个名字的人:比尔和最后一个名字:盖茨,而且我设置了比尔盖茨'它不会搜索正确的记录。我想要获取该记录。
答案 0 :(得分:0)
你做得对。只是和OR
的另一个middle_name
子句:
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')
答案 1 :(得分:0)
这可以按预期工作:
where("lower((COALESCE(people.first_name, '') || COALESCE(people.middle_name, '') || COALESCE(people.last_name, ''))) like lower(?)", "%#{text.split.join('%')}%")