簡體   English   中英

Rails過濾器記錄has_many通過

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM