我正在尝试过滤我的用户以了解他们的外语知识。我有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
另一个重要信息是LanguageLevel
具有difficulty
属性(只是一个整数,因此可以对不同的语言级别进行排序)
一个成员可能具有多种语言的语言技能,但是当我查询它们时,我希望将语言和语言级别联系起来,即语言级别与所讨论的语言相关,而不是与任何语言相关。
语言字段部分如下:
<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>
如果我使用上述部分的两个部分,它会生成以下 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] 我希望它可以获取所有讲法语的成员精通(或更高)水平和高级(或更高)水平的英语。