簡體   English   中英

ActiveRecord 查詢來過濾嵌套的 has_many 關聯

[英]ActiveRecord query to filter nested has_many associations

我想采用 ActiveRecord 模型並將關聯一直過濾到頂級,以便符合特定條件的嵌套關聯防止其父項位於返回的記錄中。

讓我更好地解釋一下。 我有以下型號:

class SuperCategory < ActiveRecord::Base
  attr_accessible :name
  has_many :categories
end

class Category < ActiveRecord::Base
  attr_accessible :name
  belongs_to :super_category
  has_many :sub_categories
  has_many :books
end

class SubCategory < ActiveRecord::Base
  attr_accessible :name
  belongs_to :category
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :sub_category
  belongs_to :category
  attr_accessible :show_me #boolean
end

在 SuperCategoriesController 中,我有:

class SuperCategoriesController < ApplicationController
  def index
    @super_categories = SuperCategory.all #here is where I want to query
    respond_with(@super_categories)
  end
end

擊中/super_categories.json端點,我會得到一些看起來像這樣的東西,它是 JSON 格式的整個樹,因為我的 .jbuilder 部分添加了所有嵌套的關聯:

[
  { 
    name: "supercategory1",
    categories: [
      { 
        name: "category1",
        books: [
          { show_me: true },
          { show_me: true },
          { show_me: false }
        ]
      },
      {
        name: "category2",
        sub_categories: [ 
          { 
            name: "subcategory1",
            books:[
              { show_me: false }
            ]
          }
        ]
      }
    ]
  },
  {
    name: "supercategory2",
    categories: [
      {
        name: "category3",
        books: [
          { show_me: false }
        ]
      }
    ]
  }
]

如果我向它傳遞一個參數,例如show_me = true ,我想在控制器中做什么,那么我不想顯示任何包含show_me == false書籍的 Books、SubCategories、Categories 和show_me == false 這是我嘗試過的:

class SuperCategoriesController < ApplicationController
  def index
    if params[:show_me] == true
      @super_categories = SuperCategory.joins(:categories).joins(:sub_categories).where(:books => { show_me: true })
    end
    respond_with(@super_categories)
  end
end

這會產生錯誤,因為我不知道如何將:categories加入:sub_categories:books 我希望結果是:

[
  { 
    name: "supercategory1",
    categories: [
      { 
        name: "category1",
        books: [
          { show_me: true },
          { show_me: true }
        ]
      }
    ]
  }
]

基本上,當我調用@super_category.categories ,應該只有那些具有嵌套書籍的類別,其中show_me == true 同樣,如果有書的子show_me == true ,其中show_me == true ,它也應該返回那些。 是否有一個ActiveRecord的組合.joins.where說讓我在那里?

這應該工作:

SuperCategory.joins(categories: :books).where("books.show_me = ?", true)
   &
SuperCategory.joins(categories: :sub_categories, :books).where("books.show_me = ?", true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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