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
我有 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