Каков «путь Rails» для выполнения запроса с предложением OR с помощью ActiveRecord? - PullRequest
1 голос
/ 31 марта 2012

Я использую Rails 3 с базой данных MySQL, и мне нужно программно создать запрос, подобный этому:

select * from table where category_name like '%category_name_1%' 
OR category_name like '%category_name_2%'
(...snip...)
OR category_name like '%category_name_n%'

Учитывая размер таблицы и масштаб проекта (думаю, не более 500 строк), я чувствую, что использование чего-то вроде мышления сфинкса было бы излишним. Я знаю, что мог бы просто сделать это, написав строку запроса напрямую, но хотел знать, есть ли способ ActiveRecord сделать это. Там нет упоминаний об этом в официальном руководстве , и я уже давно гуглю, просто чтобы закончить с пустыми руками: (

Кроме того, есть ли причина (может быть, причина Rails?), Чтобы не включать предложение OR?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 31 марта 2012

Если у вас есть массив names с именами категорий:

Model.where( names.map{"category_name LIKE ?"}.join(" OR "),
  *names.map{|n| "%#{n}%" } )
4 голосов
/ 31 марта 2012

сначала гуглите, ответа уже есть.Посмотрите здесь , а затем здесь , и вы получите что-то вроде этого:

accounts = Account.arel_table
Account.where(accounts[:name].matches("%#{user_name}%").or(accounts[:name].matches("%#{user_name2}%")))
1 голос
/ 31 марта 2012

Mysql теперь имеет функцию регулярного выражения, которая может немного привести в порядок вещи, при условии, что в именах категорий нет метасхем регулярного выражения:

Table.where "category_name regexp '#{names.join('|')}'"
1 голос
/ 31 марта 2012

Если вы посмотрите на руководство, у них есть примеры, которые можно легко изменить на это:

Client.where("orders_count = ? OR locked = ?", params[:orders], false)
...