Rails 查询关联模型范围
Rails querying an associated models scope
我正在努力为应该是一项简单的任务找到合适的解决方案。本质上,我有一个 类别模型 ,其中 有很多 posts。 post 属于 类别。
我将类别显示为搜索表单的一部分以及许多其他位置,不想显示没有关联 post 的类别。这似乎毫无意义。
我通过将以下方法添加到我的 类别 模型中设法解决了这个问题。
# Check if Category has associated results
def self.with_results
includes(:posts).where.not(posts: { id: nil })
end
这很好用,允许我过滤没有结果的类别。稍微有点混乱的是当我尝试使用范围时。
我的 Post 有几个范围,例如 frontend_visible
,它指示是否应该从前端(非管理员)访问它。
scope :frontend_visible, -> { where(:state => ['approved', 'changes_pending_approval']) }
同样,我还有其他范围可以提取 post 标记为仅限私人内容(仅限会员)的内容。
我最初的解决方案的问题是,包含未获批准的 post 的类别将不会显示,同样,非会员将无法看到 post 已获批准的类别标记为私有,但仍会显示该类别。
理想的解决方案如下:
获取所有关联 post 的类别,如果关联的 post 不是前端可见的,则忽略类别。如果 current_user 无法访问私有内容并且所有关联的 post 都标记为私有,请忽略类别。
我有示波器,但不确定如何从相关模型中使用它们。这可能吗?
据我所知,您需要 select 个类别 post 对用户可见。为此,您需要做两件事:
- 在用户的角色和post的可见范围之间建立映射
- Select 个类别 post 用户可见。在您的情况下,select 两个查询中的类别更容易,无需连接。
试试这个代码:
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
我正在努力为应该是一项简单的任务找到合适的解决方案。本质上,我有一个 类别模型 ,其中 有很多 posts。 post 属于 类别。
我将类别显示为搜索表单的一部分以及许多其他位置,不想显示没有关联 post 的类别。这似乎毫无意义。
我通过将以下方法添加到我的 类别 模型中设法解决了这个问题。
# Check if Category has associated results
def self.with_results
includes(:posts).where.not(posts: { id: nil })
end
这很好用,允许我过滤没有结果的类别。稍微有点混乱的是当我尝试使用范围时。
我的 Post 有几个范围,例如 frontend_visible
,它指示是否应该从前端(非管理员)访问它。
scope :frontend_visible, -> { where(:state => ['approved', 'changes_pending_approval']) }
同样,我还有其他范围可以提取 post 标记为仅限私人内容(仅限会员)的内容。
我最初的解决方案的问题是,包含未获批准的 post 的类别将不会显示,同样,非会员将无法看到 post 已获批准的类别标记为私有,但仍会显示该类别。
理想的解决方案如下:
获取所有关联 post 的类别,如果关联的 post 不是前端可见的,则忽略类别。如果 current_user 无法访问私有内容并且所有关联的 post 都标记为私有,请忽略类别。
我有示波器,但不确定如何从相关模型中使用它们。这可能吗?
据我所知,您需要 select 个类别 post 对用户可见。为此,您需要做两件事:
- 在用户的角色和post的可见范围之间建立映射
- Select 个类别 post 用户可见。在您的情况下,select 两个查询中的类别更容易,无需连接。
试试这个代码:
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