has_many_association 多个查询使其变慢

has_many_association multiple queries making it slow

我有 has_many_association table。例如用户 has_many 订阅。在活动管理员的索引页面上,我显示了多个计算字段,我需要为其调用 user.subscriptions.last。因为我多次调用它。因此,由于这个原因,我们的服务器超载了。它是在索引页上处理的,因为它在那里只显示 30 个条目。但是在导出为 CSV 时,我们的服务器会由于多个查询而超载。我正在为一个用户使用大约 15 个查询。

这里的问题是我必须检查有效订阅以打印其代码。我也不能在 scoped_collection 中放置查询,因为它只会加载有效订阅的用户数据。那么如何解决这个问题呢??????

def scoped_collection
  end_of_association_chain.includes(:subscriptions, :blogs)
end
index do  
  column :email
  column "referrer" do |user|
    subscription = user.subscriptions.valid.first
    subscription.referrers.first.code if subscription
  end
  column "blog_id" do |user|
     user.blog.id if user.blog
  end

end

用户has_many订阅和订阅has_many推荐人我想要第一个推荐人代码

将此行添加到您的 users.rb 文件

 controller do
      def scoped_collection
        # Method 1  
        super.includes(subscriptions: :referrers) # prevents N+1 queries to your database
        # method 2
        User.includes(subscriptions: :referrers).select("users.*, (SELECT referrers.code from referrers LIMIT 1) as refer_code")
      end
  end

在你的控制器中调用 @subscriptions = current_user.subscriptions

然后在您的视图中根据需要调用 @subscriptions.last,并且不会在视图中调用新查询,因为记录已经加载到控制器中。

检索所有字段:

controller do
  def scoped_collection
    Model.all.as_json(include: [:subscriptions,:referrers])
    # prevents N+1 queries to your database
  end
end

检索一些字段,例如:

controller do
   def scoped_collection
     Model.all.as_json(include: [:subscriptions => {only: :field1}])                                       
   end
 end