2017-01-01 4 views
0

У меня есть форма, в которой есть вложенное поле (habtm и accepts_nested_attributes_for). Эта форма содержит поле «ключевые слова», которое автоматически заполняет ключевые слова, которые поступают из таблицы postgresql.рельсы: как я могу использовать find_each с картой?

Все, что хорошо работает. Это значение находится в параметрах:

"acte"=>{"biblio_id"=>"1", "keywords"=>{"keywords"=>"judge, ordeal, "} 

Что мне теперь нужно сделать, это взять эти ключевые слова и получить их ключевые слова из ключевых слов таблицы. Эти идентификаторы должны быть добавлены в таблицу соединений.

Я делаю это:

q = params[:acte][:keywords].fetch(:keywords).split(",") 
a = q.map {|e| Keyword.find_by keyword: e } 

В соответствии с гидами, find_by возвращает только первое поле соответствия. Я думаю, мне нужно будет использовать find_each, но я не уверен в этом, и я не могу донести его до слова. Я попытался это:

q = params[:acte][:motclefs].fetch(:motclefs).split(",") 
a = Array.new 
Motclef.where(motcle: q).find_each do |mot| 
    a << mot.id 
end 

Это также находит только первый результат, как: [251].

Что я ищу, чтобы получить что-то вроде [1453, 252, 654]

спасибо!

ответ

0

Помещение find_by в цикл означает, что вы будете выполнять отдельный SQL-запрос для каждого ключевого слова SQL.

Вы можете вместо этого просто получить все идентификаторы в одном вызове SQL, выполнив keyword in.

После того, как вы сделаете q = params[:acte][:keywords].fetch(:keywords).split(","), ваш q будет представлять собой множество ключевых слов. Таким образом, q будет ["judge", " ordeal"].

Вы можете просто сделать Keyword.where(keyword: q).select(:id), который будет генерировать запрос типа SELECT keywords.id FROM keywords where keyword in ('judge', 'ordeal').