所以,让我们说我有一个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,根据我的理解,较少的查询通常意味着更快的查找时间。
答案 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"} })
此结果基于创建具有主题数学和评论的帖子的所有用户。