【问题标题】:ActiveRecord query to filter nested has_many associationsActiveRecord 查询过滤嵌套的 has_many 关联
【发布时间】: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


    【解决方案1】:

    这应该可行:

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

    【讨论】:

    • & 只是在答案中分离了 2 个替代项,无需将其添加到代码中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多