2016-07-25 7 views
0

У меня есть массив хэш.Запрос ActiveRecord из массива hash

eg) array_of_hash = [ { id: 20, name: 'John' }, { id: 30, name: 'Doe'} ] 

Я хотел бы получить записи, которые соответствуют всем критериям в конкретном хэше. Так запрос я хочу, чтобы получить исполненного

SELECT persons.* FROM persons WHERE persons.id = 20 AND persons.name = 'John' OR persons.id = 30 AND persons.name = 'Doe' 

Что является лучшим способом для создания этого запроса из массива хэша?

ответ

1

Я думаю, что это хорошо:

ids = array_of_hash.map { |h| h[:id] } 
names = array_of_hash.map { |h| h[:name] } 

Person.where(id: ids, name: names) 

(хотя это не супер родовое) другой Попытка:

people = Person.all 
array_of_hash.each do |h| 
    people = people.where(h) 
end 
people # => will generate a long long query. 
+0

Как удалить \t '{id: 20, name: 'Doe'}'? –

+0

Я думаю, что OP хочет что-то вроде ((id1 и name1) или (id2 и name2)), не так ли? –

+0

Это может вернуть записи с идентификатором - 20 и именем - «Doe». Мне нужны записи, которые соответствуют всем условиям в конкретном хэше. –

0

Попытка отобразить все условия для вашей модели ActiveRecord независимо друг от друга и придавить массив результатов после:

array_of_hash.map{ |where_clause| Person.where(where_clause) }.flatten 
+0

Как бы вы сгладили массив 'ActiveRecord :: Relation' – siegy22

+0

Не будет ли это выполнение запроса для каждого отдельного предложения? Я бы предпочел, чтобы все записи могли быть загружены в один запрос. –

+0

@RaVeN Вы можете просто проверить его здесь. 'ActiveRecord :: Relation' автоматически становится обычным массивом. Я не думаю, что нисходящее направление здесь уместно. –

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