[英]Rails filter records has_many through
我正在嘗試使用通過has_many連接的,名為genres的過濾器搜索Item模型。
我的問題是,當我選擇兩種或兩種以上類型時,它還會選擇僅包含一種類型的記錄。
示例:有兩種類型,分別稱為動作和冒險。 記錄A具有動作類型,記錄B具有兩種類型。 通過在我的視圖中同時選中兩個流派復選框,Rails返回的記錄將同時包含記錄A和B,而應該只記錄B。
這是我在控制器下的過濾器語句
//This is under controller
@item = Item.includes(:genres).where('genres.id' => params['genre_ids'])
// This is under my view
<%= simple_form_for Item.new, :method => :get, url: search_path do |f| %>
<% Genre.all.each do |sc| %>
<div>
<label>
<%= check_box_tag 'genre_ids[]',sc.id %>
<span style="font-weight:normal;"><%= sc.name %> </span>
</label>
</div>
<% end %>
<% end %>
它不起作用的原因是從表達式創建的SQL中。 where('genres.id' => [1, 2, 3])
為您提供SELECT ... WHERE genres.id IN (1,2,3)
,它基本上是OR表達式。
要解決此問題,您需要過濾Ruby或SQL中選定流派的數量。 我會用這樣的SQL:
genre_ids = params['genre_ids']
items = Item.joins(:genres).where('genres.id' => genre_ids).group('items.id').having("count(*) = #{genre_ids.size}")
這樣,您將選擇具有確切給定類型的項目。 記住要處理帶有空genre_ids
的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.