通过has_many关系获取ActiveRecord对象集合的最有效方法是什么?

时间:2017-01-11 13:55:58

标签: ruby-on-rails activerecord

目录模型:

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”的方式来做到这一点?

0 个答案:

没有答案