我有一个博客,其中包含子类别/主要类别,并且在主要类别上,我希望它列出其所有子类别中的帖子。我可以使用方法.first
使用它,但是我只是不知道如何以我需要的方式来处理它。
BlogCategory模型:
class BlogCategory < ApplicationRecord
extend FriendlyId
friendly_id :name, use: :slugged
has_many :posts
# This is called a self referential relation. This is where records in a table may point to other records in the same table.
has_many :sub_categories, class_name: "BlogCategory", foreign_key: :parent_id
belongs_to :parent, class_name: 'BlogCategory', foreign_key: :parent_id
# This is a scope to load the top level categories and eager-load their posts, subcategories, and the subcategories' posts too.
scope :top_level, -> { where(parent_id: nil).includes :posts, sub_categories: :posts }
def should_generate_new_friendly_id?
slug.nil? || name_changed?
end
end
blog_categories控制器:
def show
@cat = BlogCategory.friendly.find(params[:id])
@category = @cat.parent
@posts = @cat.posts
@sub_category = @cat.sub_categories.first
unless @sub_category.nil?
@relatives = @sub_category.posts
end
end
private
def cat_params
params.require(:blog_category).permit(:name, :parent_id, :sub_category)
end
def main_cat
@cat = BlogCategory.parent_id.nil?
end
发布模型: belongs_to :blog_category
我尝试了.all
.each
的一些配置,看是否.collection
有效,但是这些似乎无法解决我的问题。
谢谢,我对此表示感谢。
答案 0 :(得分:0)
我想您想要所有帖子。如果帖子属于某个类别,则该类别将是另一个类别的子类别,最终,您将拥有主要类别,因此,您可以执行以下操作:
@posts = Post.where.not(blog_category: nil)
如果您有许多主要类别,每个博客一个,则需要实现一种递归方法。
您还可以使用https://github.com/collectiveidea/awesome_nested_set
并执行以下操作:
@cat.descendants # array of all children, children's children, etc., excluding self
https://github.com/collectiveidea/awesome_nested_set/wiki/Awesome-nested-set-cheat-sheet
答案 1 :(得分:0)
您可以像这样在您的类别模型中添加一个具有多个关联的
has_many :sub_category_posts, through: :sub_categories, source: :posts
在您的控制器中
@relatives = @cat.sub_category_posts