Multiple LIKE and AND operators in RAILS/POSTGRESQL

倾然丶 夕夏残阳落幕 提交于 2019-12-24 01:54:03

问题


I'm using Rails 5.0.1 and Postgresql as my database. I have a table with column :content which contains words.

The problem: When I'm looking for a specific word, I want to see if the word contains letters (chars) of my choice. Let's say i want to DB to return words containg letters "a", "b" and "c" (all of them, but with no specific order)

What I'm doing: I found that i could use Word.where("content like ?", "%a%").where("content like ?", "%b%").where("content like ?", "%c%") OR Word.where("content like ? content like ? content like ?", "%a%", "%b%", "%c%") In both cases even if i switch order of given letters/substrings it works fine, ex. both would find word "back", "cab" etc..

The question: Is there any better/more DRY way to do it? What if want to find word with 8 different letters? Do i have to use "content like ?" 8 times? Is it possible to pass arguments as an array? (let's assume i don't know how many letters user will input)


回答1:


PostgreSQL has a handy expr op all (array) expression so you can say things like:

where content like all (array['%a%', '%b%', '%c'])

as a short form of:

where content like '%a%'
  and content like '%b%'
  and content like '%c%'

Also, ActiveRecord will conveniently replace a ? placeholder with a comma-delimited list if you hand it a Ruby array. That lets you say things like:

Word.where('content like all (array[?])', %w[a b c].map { |c| "%#{c}%" })

and:

Word.where('content like all (array[?])', some_other_array.map { |c| "%#{c}%" })



回答2:


I found a solution:

letters = ["%a%", "%b%", "%c%"]
Word.where((['content LIKE ?'] * letters.size).join(' AND '), *letters)

This is easy and much better than I was using.




回答3:


I think the SIMILAR TO operator might help. It allows you to pass in a regular expression that you could construct on the fly.

letters = ['a', 'b', 'c']
pattern = "%(#{letters.join('|')})%"
Word.where("content SIMILAR TO ?", pattern)


来源:https://stackoverflow.com/questions/42124181/multiple-like-and-and-operators-in-rails-postgresql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!