[英]ActiveRecord, has_many :through, and Polymorphic Associations
[英]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.