2017-01-01 2 views
0

私は入れ子フィールド(habtmとaccepts_nested_attributes_for)を持っているフォームを持っています。そのフォームにはフィールド "keywords"が含まれており、postgresqlテーブルから来るキーワードを自動補完します。rails:マップでfind_eachを使用するにはどうすればよいですか?

すべてうまくいきます。これはparamsにあります:

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

私が今必要とするのは、それらのキーワードを取り、テーブルのキーワードからkeyword_idを取得することです。これらのIDは結合テーブルに追加する必要があります。

私はこれをやっている:ガイド、find_byリターンのみ最初に一致したフィールドを1として

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

。私はfind_eachを使用する必要があると思うが、私はそれについて確信が持てません。私はこれを試してみました:[251]:これはまた、唯一の最初の結果のように見つけ

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

。私が取得しているよ何

[1453, 252, 654]

おかげのようなものです!

答えて

0

find_byをループに入れると、SQLキーワードごとに個別のSQLクエリを実行します。

代わりに、keyword inを実行して、単一のSQL呼び出しですべてのIDを取得することができます。

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')のようなクエリが生成されます。

関連する問題