2

我正在努力为应该是一项简单的任务找到合适的解决方案。本质上,我有一个包含许多帖子的类别模型。该帖子属于该类别

我将类别显示为搜索表单的一部分以及许多其他地方,并且不想显示没有关联帖子的类别。这似乎有点毫无意义。

我设法通过将以下方法添加到我的类别模型来解决这个问题。

# Check if Category has associated results
def self.with_results
  includes(:posts).where.not(posts: { id: nil })
end

这很好,让我可以过滤没有结果的类别。稍微更令人困惑的是当我尝试使用范围时。

我的帖子有几个范围,例如frontend_visible它是否应该从前端(非管理员)访问。

scope :frontend_visible, -> { where(:state => ['approved', 'changes_pending_approval']) }

同样,我还有其他范围可以拉出仅标记为私有内容的帖子(仅限成员)。

我最初的解决方案的问题是不会显示包含未批准帖子的类别,同样非成员将无法看到标记为私人的帖子,尽管该类别仍将显示。

理想的解决方案是这样的:

获取所有具有关联帖子的类别,如果关联帖子在前端不可见,则忽略类别。如果 current_user 无法访问私有内容并且所有相关帖子都标记为私有,则忽略类别。

我有范围,但我不确定如何从相关模型中使用它们。这可能吗?

4

1 回答 1

2

据我了解,您需要选择帖子对用户可见的类别。为此,您需要做两件事:

  1. 在用户的角色和帖子的可见范围之间进行映射
  2. 为用户可见的帖子选择类别。在您的情况下,在两个查询中选择该类别会更容易,无需连接。

试试这个代码:

class Category < ApplicationRecord
  has_many :posts

  scope :with_posts_for_user, -> (user) do
    where(id: Post.categories_for_user(user))
  end
end

class Post < ApplicationRecord
  belongs_to :category

  scope :frontend_visible, -> { where(:state => ['approved', 'changes_pending_approval']) }
  scope :member_visible, -> { where(:state => ['approved', 'changes_pending_approval', 'private']) }

  scope :categories_for_user, -> (user) do
    (user.member? ? member_visible : frontend_visible).distinct.pluck(:category_id)
  end
end
于 2017-04-05T10:07:04.317 回答