首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4.2中has_many的条件?

问Rails 4.2中has_many的条件?
EN

Stack Overflow用户
提问于 2016-06-11 15:30:47
回答 2查看 135关注 0票数 1

我有一个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,那么返回作者编写的所有帖子上的所有标记,但我只希望它返回作者编写的已批准的帖子上的标记。假设作者有两个帖子,第一个帖子被批准,标签是‘章鱼’,第二个帖子还没有被批准,并被标记为‘鱿鱼’:在作者上调用#标签应该只返回章鱼标签,而不是鱿鱼标签。

EN

回答 2

Stack Overflow用户

发布于 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的标记模型。

第一件事是第一件事,让我们整理一下这些关系。我相信这是你真正想要的:

代码语言:javascript
复制
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;如下所示:

代码语言:javascript
复制
class Post < ActiveRecord::Base
  scope :approved -> { where(status: Post.statuses['approved']) }
end

然后,您只可以通过Post.approved显示已批准的帖子;或者只可以通过Post.where(user: foo).approved显示特定用户的已批准的帖子。

为了显示一个标签列表,例如,您可以这样做:

代码语言:javascript
复制
Post.where(user: foo).approved.map(&:tags).uniq

这只会给您一个Array,而不是ActiveRecord::Collection。但就你的目的而言,这可能已经足够了。

票数 0
EN

Stack Overflow用户

发布于 2016-06-11 16:17:02

您可以查看has_many本身。例如:

代码语言:javascript
复制
class Author
  has_many :moderated_posts, -> { moderated }, class_name: 'Post' 
end

class Post
  scope :moderated, -> { where(status: approved_statuses) }
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37765457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档