【发布时间】:2016-07-26 05:16:53
【问题描述】:
我想采用 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 .这是我尝试过的:
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 的书籍的子类别,它也应该返回这些。是否有 .joins 和 .where 的 ActiveRecord 组合可以让我到达那里?
【问题讨论】:
标签: ruby-on-rails ruby json postgresql activerecord