これは Rails の基本的なことのはずですが、やり方がわかりません。
参加者が話す言語に基づいて参加者をフィルタリングしたいと思います。人々は複数の言語を話すことができ、言語は 1 対多の関係で独自のテーブルに格納されます。
今、私の検索は本当にぎこちなく見え、うまくいかないようです:
if @cvsearch.language.present? == true and @cvsearch.language != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language)
else
@cvsearch.language = 0
end
if @cvsearch.language1.present? == true and @cvsearch.language1 != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language1)
end
if @cvsearch.language2.present? == true and @cvsearch.language2 != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language2)
end
if @cvsearch.language3.present? == true and @cvsearch.language3 != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language3)
end
結果の SQL は、わずかに短縮されています。
SELECT COUNT(*) FROM "participants" INNER JOIN "languages" ON "languages"."participant_id" = "participants"."id" WHERE (participants.id >= 2) AND (languages.name = 11) AND (languages.name = 10)[0m
特定の解決策を得ることは素晴らしいことですが、これについてどこで読むことができるかについてのポインタはさらに良いでしょう - この問題を説明するために欠けているキーワードは何ですか?
だから、これは私が今使っている解決策です:
if @cvsearch.language1.present? == true and @cvsearch.language1 != 0
safe_lang = ActiveRecord::Base::sanitize(@cvsearch.language1)
qry = "INNER JOIN languages l1 ON l1.participant_id = participants.id AND l1.name = " + safe_lang.to_s
@p = @p.joins(qry)
end
このアプローチの安全性に関するフィードバックを得る必要があります。