has_many_association多个查询使其变慢

时间:2018-09-04 05:33:55

标签: ruby-on-rails activeadmin

我有has_many_association表。例如用户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推荐人,我想要第一个推荐人代码

3 个答案:

答案 0 :(得分:1)

将此行添加到您的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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

检索所有字段:

indexPath

检索某些字段,例如:

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