我有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推荐人,我想要第一个推荐人代码
答案 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