我有一个可以有标签的帖子,一个标签有一个类别。现在我需要创建一个“已发布”的范围。只有在每个可用类别中都有标签时,才能发布帖子。换句话说。如果数据库包含 4 个 tagcategory 记录,则帖子应该在所有这 4 个类别中都有标签,才能被视为已发布。
一个帖子有很多标签(通过 tag_categories)。并且标签属于一个tag_category。一个标签类别有很多标签
在 post 实例上,我可以轻松创建这样的方法:
def has_tags_in_all_categories?
#select all category id's
category_ids = TagCategory.pluck(:id)
#select all post tag id's
tag_ids = self.tags.pluck(:tag_category_id)
#create a new array with the category ids from the post.tags subtracted from all category ids
remaining = category_ids.reject{|x| tag_ids.include? x}
#if id's are left in the array -> Not all categories are filled in.
remaining.empty?
end
但是要在单个页面上显示所有已发布的帖子,我需要创建一个范围。遍历所有帖子并应用此方法,显然会导致大量不必要的数据库查询。
谁能帮我查询一下?
class Post < ActiveRecord::Base
def self.published
find(:all) #No clue here
end
end
数据库(对不起,我不知道如何使这个花哨):
posts
id
title
posts_tags
post_id
tag_id
tags
id
tag_category_id
name
tag_categories
id
name