目录模型:
has_many :categories, dependent: :destroy
has_many :docs, through: :categories
Doc模型:
belongs_to :category
我的目标是获取符合我的查询的所有Doc对象的集合,但只获取用户通过Pundit授权的目录中的那些文档。
我目前有:
catalogs = Pundit.policy_scope(user, Catalog) #get only catalogs I'm authorized for
docs = []
catalogs.each do |catalog|
catalog.docs.where(["title like ?", query]).each do |doc|
docs.push doc
end
end
这会返回我想要的记录,但对我来说似乎效率低下,我宁愿拥有一个ActiveRecord集合而不是一个数组。有没有办法更直接地获得这些记录?我最初尝试过类似的东西:
docs = Pundit.policy_scope(user, Catalog).docs
但那没用。无法在集合中找到名为docs
的方法。通常看起来像you could use some kind of join for this,但我无法弄清楚如何使用Pundit来过滤目录。
使用梅加尔的建议,我想出了这个:
category_ids = Pundit.policy_scope(user, Catalog).joins(:categories).flat_map(&:category_ids)
docs = Doc.where(category_id: category_ids).where(['title like ?', query])
哪个有效。这是否有效我可以去?是否有更“Railsy”的方式来做到这一点?