ユーザーの外国語知識をフィルタリングしようとしています。、およびLanguageSkill
に属するモデルを持っています。Member
Language
LanguageLevel
class LanguageSkill < ActiveRecord::Base
attr_accessible :member_id, :language_id, :language_level_id
belongs_to :member
belongs_to :language
belongs_to :language_level
end
もう 1 つの重要な情報はLanguageLevel
、difficulty
属性 (異なる言語レベルを順序付けることができるように単なる整数)を持っていることです。
メンバーは複数の言語の言語スキルを持っているかもしれませんが、クエリを実行するときは、言語と language_level を関連付けたいと考えています。つまり、言語レベルがどの言語でもなく、問題の言語に関連付けられるようにします。
言語フィールドの一部は次のとおりです。
<div class="field">
<div class="language">
<%= select_tag :'q[language_skills_language_id_eq_all][]', options_from_collection_for_select(Language.all, 'id', 'name') %>
</div>
<div class="language_level">
<%= select_tag :'q[language_skills_language_level_difficulty_gteq_all][]', options_from_collection_for_select(LanguageLevel.all, 'difficulty', 'name') %>
</div>
<%= link_to '#', :class => "remove_fields" do %>
<button class="btn btn-link btn-mini">
<i class="icon-remove"></i> <%= t('general.remove') %>
</button>
<% end %>
</div>
上記のパーシャルを 2 つ使用すると、次の SQL が生成されます。
SELECT DISTINCT "members".* FROM "members" LEFT OUTER JOIN "language_skills" ON "language_skills"."member_id" = "members"."id" LEFT OUTER JOIN "language_levels" ON "language_levels"."id" = "language_skills"."language_level_id" WHERE ((("language_skills"."language_id" = 38 AND "language_skills"."language_id" = 59) AND ("language_levels"."difficulty" >= 5 AND "language_levels"."difficulty" >= 3)))
ransack に生成させたい SQL が何であるか正確にはわかりませんが、[French, Proficient] と [English, advanced] を入力すると、Proficient でフランス語を話すすべてのメンバーを取得したいと思います。 (またはそれ以上) のレベルと上級 (またはそれ以上) のレベルの英語。