使用查询预加载模型的关联

时间:2016-09-01 22:12:41

标签: ruby-on-rails postgresql activerecord eager-loading preloading

所以,让我们说我有一个Users类,我就像这样获取一个User实例:

@user = User.first

让我们说用户has_many:帖子和帖子has_many:评论。我想预先加载帖子和评论关联以便稍后使用。这可以通过执行以下操作来实现:ActiveRecord::Associations::Preloader.new.preload(@user, {:posts => :comments}) 但是我也希望对这个模型及其预加载的关联运行一些查询。所以基本上,我想要一些相当于的东西 User.where({:comments => {:post => {:topic => "math"}}).includes({:posts => :comments}).find(some_id)。但是,由于我已经加载了一次模型,我不想再次加载它。有没有办法将where子句传递给上面的Preloader语句,以便创建一个大的SQL查询而不是几个较小的SQL查询?我使用的是Postgres,根据我的理解,较少的查询通常意味着更快的查找时间。

2 个答案:

答案 0 :(得分:0)

使用

@user = User.includes(posts: :comments).first

然后后续查询将在预加载的帖子和评论上运行 或使用该查询的缓存版本......

答案 1 :(得分:0)

我想请你指明更多细节,因为我无法正确理解你想要什么。 正如我能够理解的那样,我在这里指定有用的代码请更新相同如果这没有帮助

我有一个模特

app / models / user.rb

class User < ApplicationRecord
    has_many :posts
    has_many :comments
end

应用程序/模型/ post.rb

class Post < ApplicationRecord
    belongs_to :user
    has_many :comments
end

应用程序/模型/ comment.rb

class Comment < ApplicationRecord
    belongs_to :post
    belongs_to :user
end

这里我们将获得包含主题的所有帖子是带有用户和评论的数学。 所以我们可以写下面的代码。

User.eager_load(:posts,:comments).where({posts: {topic:"math"} })

此结果基于创建具有主题数学和评论的帖子的所有用户。