2015-03-26 2 views
1

Я использую ruby ​​on rails 4 и SQLite3. Я хотел бы запросить таблицу/модель, используя хэш комбинаций Column => Value. Учитывая хэш:Таблица запроса/фильтра с использованием хеша в рубине на рельсах

a = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"} 

и части стола:

PART  SIZE  TYPE  MATERIAL OPTION 1  OPTION 2 
A1234 1  Tall  
A1233 2  Tall 
A1232 3  Tall 
A1231 4  Tall 
A8787      Plastic 
A8786-01     Metal  Yes 
A8786-02     Metal  No 
A8785      Liquid 
A6543            Yes 

Я хотел бы запрос, чтобы смотреть на каждую колонку, и вернуть все Parts, которые содержат значение, заданное в хэш, а также любые экземпляры, содержащие ноль или пробел. Поэтому значение "Option 1" => "Yes" должно содержать A8786-01, а также все остальные части в этом столбце, которые пусты. Или, другими словами, A8786-02 будет устранен.

Хэш, показанный выше, вернет детали ["A1234", "A8786-01"]. Можно ли это сделать одним методом? Или строка областей? Я открыт для любого хорошего способа обойти это. Я думал, что это может включать цикл через хэш с помощью a.each, но я не уверен, как это будет работать.

ответ

2

Основной where метод:

attrs = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"} 
Part.where(attrs) 

Возвращает Part записей соответствие точно каждому из заданных значений для каждого атрибута.


Другой способ сделать это:

attrs = {"Size" => 1, "Type" => "Tall", "Material" => "Metal", "Option 1" => "Yes", "Option 2" => "No"} 
sql_query = attrs.map { |col, val| "(parts.#{sanitize(col)} = #{sanitize(val)} OR pars.#{sanitize(col)} IS NULL)" }.join(" AND ") 
Part.where(sql_query) 

Возвращает Part записей соответствие каждому из заданных значений или имеющих NULL значения (но не пустые строки "") для указанных столбцов.

Я уже вижу недостаток здесь: он вернет Part записей, имеющих NULL значений для каждого «желаемого значения». Пример:

# consider this dummy data 
# PART  SIZE  TYPE  MATERIAL OPTION 1  OPTION 2 
# A1234 1  Tall  
# A1233 

attrs = { "Size" => 1, "Type" => "Tall" } 
sql_query = attrs.map { |col, val| "(parts.#{sanitize(col)} = #{sanitize(val)} OR pars.#{sanitize(col)} IS NULL)" }.join(" AND ") 
Part.where(sql_query) 
# will returns A1234 AND A1233 records 
+0

На самом деле, я считаю, что «недостаток» - это именно то, что я хочу. Если вы думаете об электронной таблице Excel с фильтрами, я в основном хочу пройти через каждый столбец и выбрать одно значение атрибута, а также все пробелы, нули и пустые строки, поэтому я хотел бы, чтобы этот поиск возвращал как A1234, так и A1233, если только есть значение в РАЗМЕРЕ или ТИП, отличном от 1 и Tall. Я попробую и посмотрю, работает ли это! – sabrams

+0

Есть ли что-нибудь еще, что я мог бы внести в свой ответ, чтобы решить вашу проблему @sabrams? – MrYoshiji

+0

Я так не думаю. Я включу его в свой код сегодня днем ​​и выберем ваш ответ, если нет серьезных проблем. Спасибо! – sabrams

Смежные вопросы