Rails динамически добавляет условие в запрос MySQL - PullRequest
0 голосов
/ 12 декабря 2018

Как динамически добавить условие в SQL-запрос

, например, если у меня есть один элемент, он будет выглядеть как

query=['one_element']

User.where('name LIKE ?, %"#{query[0]}"%')

, но если его больше, чем один

User.where('name LIKE ? and LIKE ? and Like... , %"#{query}"%', ..so on)

Я использую myslq

, поэтому моя главная цель - разделить поисковый запрос, если он содержит более 2 слов, и выполнять поиск по ним отдельно в одном SQL-запросе

not where(name:'john dou') but where(name:'john' and name:'dou')

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Если у вас есть версия MySQL, которая поддерживает RLIKE или REGEXP_LIKE:

User.where("RLIKE(name, :name_query)", name_query: query.join("|"))

В противном случае вам придется вручную строить с помощью оператора ActiveRecord or:

# In the User model
scope :name_like, ->(name_part) {
  return self.all if name_part.blank?
  where("name LIKE :name_query", name_query: "%#{name_part}%")
}
scope :names_like, ->(names) {
  relation = User.name_like(names.shift)
  names.each { |name| relation = relation.or(name_like(name)) }
  relation
}

Затем вы можете передать ему массив любых именных частей:

query = ["john", "dou"]
User.names_like(query)
0 голосов
/ 12 декабря 2018

Сначала разделите слово по его разделителю, как это query.split(' '), это даст вам массив слов.Тогда вы можете использовать как ниже в рельсах.

User.where(name: ['John', 'dou']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...