gpt4 book ai didi

ruby-on-rails - Rails has_many :through and N+1

转载 作者:行者123 更新时间:2023-12-04 07:39:03 25 4
gpt4 key购买 nike

我有两个关联模型:Chat 和 User through Memberships 模型

class Chat < ActiveRecord::Base
has_many :memberships
has_many :members, through: :memberships
end

class Membership < ActiveRecord::Base
belongs_to :chat
belongs_to :member, class_name: "User", foreign_key: 'user_id'
end

在 Controller 中,我检索这样的记录:
@chats = Chat.joins(:memberships).includes([:owner, :memberships=>:member])
.where("chats.owner_id = ? OR memberships.user_id = ?", current_user.id, current_user.id)

在 View 中,我会像这样显示与 JBuilder 的聊天:
json.extract! @chat, :id
json.members @chat.memberships.order('id ASC') do |membership|
json.name membership.member.name
end
end

但是 Rails 会生成大量的数据库查询,并且 View 渲染需要很长时间:
Completed 200 OK in 1597ms (Views: 1393.8ms | ActiveRecord: 150.8ms)

如何优化和加速这些查询?

最佳答案

我认为这里的问题是:

您包括:memberships , 在连接中,所以如果你调用 chat.memberships它将使用存储在内存中的成员资格。

但是你调用chat.memberships.order('id ASC')这是一个 Rails 没有缓存的 sql 查询,因此必须调用。

简单的解决方案是使用 Ruby 而不是 SQL 进行排序:

chat.memberships.sort_by(&:id)

关于ruby-on-rails - Rails has_many :through and N+1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com