2016-12-16 2 views
0

Давайте есть таблица elements со многими строковых столбцов (c1, c2, c3)рельсы find_by_all атрибуты

А есть ли рельсы путь к find_by_all (my_string), где по крайней мере один из столбцов установлен в положение «my_string» без перечисления всех их вместо запроса, как это:

Element.where(c1: "my_string").or.where(c2: "my_string").or.where(c3: "my_string") 

или

Element.find_by_c1("my_string") || Element.find_by_c2("my_string") || Element.find_by_c3("my_string") 

(я знаю я могу использовать SQL трюк, как: Element.where(CONCAT_WS('|', c1, c2, c3) LIKE '%my_string%'), но это на самом деле не railzy)

+0

Нет, я так не думаю. Я бы пошел с третьим вариантом, который вы указали. В некоторых случаях можно выйти из activerecord. –

ответ

1

Вы можете сделать что-то вроде следующего (Конечно, если строка такая же)

Element.where('c1= :var OR c2= :var OR c3= :var', { var: 'my_string' }) 

Для всех столбцов

Element.where(%w(c1 c2 c3).map{|col| "#{col} = :var"}.join(' OR '), { var: 'my_string' }) 
0

Вы должны указать все столбцы, которые вы хотите запросить.

columns = %w(c1 c2 c3) 

Или использовать column_names метод

columns = Element.column_names 

затем использовать rails_or и сделать это как

str = 'my_string' 
columns.inject(Element.where(0)){|model, col| model.or(col => str) } 

Обратите внимание, что вы можете захотеть, чтобы исключить ни-строковые столбцы как id, created_at, updated_at:

columns -= %w(id created_at updated_at) 
Смежные вопросы