我有一个has_many :authors和has_many :标记通过:tag_posts的Post模型,一个has_many :Post和has_many :标记通过:Post的作者模型,以及has_many :Post通过:tag_posts的标记模型。
帖子必须通过审核(存储为枚举Post.status)才能在站点上看到。版主可以通过寻找具有不同Post.status的帖子来查看未经审核的帖子,但是普通用户不应该能够看到它们。
有什么办法我可以过滤所有这些协会,以确保他们只返回版主批准的帖子?
例如:如果我现在调用Author#tags,那么返回作者编写的所有帖子上的所有标记,但我只希望它返回作者编写的已批准的帖子上的标记。假设作者有两个帖子,第一个帖子被批准,标签是‘章鱼’,第二个帖子还没有被批准,并被标记为‘鱿鱼’:在作者上调用#标签应该只返回章鱼标签,而不是鱿鱼标签。
发布于 2016-06-11 15:51:30
我有一个has_many :authors和has_many :标记通过:tag_posts的Post模型,一个has_many :Post和has_many :标记通过:Post的作者模型,以及has_many :Post通过:tag_posts的标记模型。
第一件事是第一件事,让我们整理一下这些关系。我相信这是你真正想要的:
class Post < ActiveRecord::Base
belongs_to :author # NOT has_many
has_and_belongs_to_many :tags # use an implicit join table
end
class Author < ActiveRecord::Base
has_many :posts
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :posts # use an implicit join table
end有什么办法我可以过滤所有这些协会,以确保他们只返回版主批准的帖子?
是。不需要详细介绍,关键技术是在scope模型上定义一个Post;如下所示:
class Post < ActiveRecord::Base
scope :approved -> { where(status: Post.statuses['approved']) }
end然后,您只可以通过Post.approved显示已批准的帖子;或者只可以通过Post.where(user: foo).approved显示特定用户的已批准的帖子。
为了显示一个标签列表,例如,您可以这样做:
Post.where(user: foo).approved.map(&:tags).uniq这只会给您一个Array,而不是ActiveRecord::Collection。但就你的目的而言,这可能已经足够了。
发布于 2016-06-11 16:17:02
您可以查看has_many本身。例如:
class Author
has_many :moderated_posts, -> { moderated }, class_name: 'Post'
end
class Post
scope :moderated, -> { where(status: approved_statuses) }
endhttps://stackoverflow.com/questions/37765457
复制相似问题