Ruby on rails Graphql Ruby N+;1查询,因为方法调用了另一个关系

Ruby on rails Graphql Ruby N+;1查询,因为方法调用了另一个关系,ruby-on-rails,graphql,lazy-loading,graphql-ruby,n-plus-1,Ruby On Rails,Graphql,Lazy Loading,Graphql Ruby,N Plus 1,我正在使用graphql和批处理加载器gems并运行此N+1查询: 我有一个属于某个帐户的日历约会,当我们显示约会时间时,我们会根据该帐户的时区进行设置 def appointment_time read_attribute(:appointment_time).in_time_zone(self.account.timezone) end 结果是N+1查询 POST /graphql USE eager loading detected CalendarAppt => [:ac

我正在使用graphql和批处理加载器gems并运行此N+1查询:

我有一个属于某个帐户的日历约会,当我们显示约会时间时,我们会根据该帐户的时区进行设置

def appointment_time
  read_attribute(:appointment_time).in_time_zone(self.account.timezone)
end
结果是N+1查询

POST /graphql
USE eager loading detected
  CalendarAppt => [:account]
  Add to your query: .includes([:account])
Call stack
  /....rb:866:in `appointment_time'
  /.../app/controllers/graphql_controller.rb:17:in `execute'
我还有许多其他类似的实例方法创建N+1查询,不确定解决这个问题的最佳方法

到目前为止,我刚刚看到了直接征服渴望加载关联的方法。我是否需要将这些方法视为关联

例如,这就是我加载帐户本身的方式,当我调用此方法时是否也需要执行类似的操作

    field :account,
          AccountType,
          null: true,
          resolve: lambda { |obj, _args, _ctx|
            BatchLoader::GraphQL.for(obj.account_id).batch do |account_ids, loader|
              Account.where(id: account_ids).each { |account| loader.call(account.id, account) }
            end
          }
那么,如果我们做了类似的事情,它会打两次电话给客户吗

calendarAppts {
  appointmentTime
  account {
    id
    name
  }
}

假设您正在使用
graphql-ruby
来处理查询,您应该使用它来查看需要哪些子字段,并相应地准备查询

因此,在您的情况下,在实现CallendarApps的方法中,您应该执行以下操作:

字段:日历应用程序,…,附加:[:前瞻]
def callendar_应用程序(lookadead:)
范围=模型。其中(…)
if(前瞻。选择?(:约会时间))
范围=范围。包括([:帐户])
结束
范围.全部
结束

(我在这里吐痰,因为还没有提供实际的实现)

我要看一看,但我使用的是
graphql
gem,但它是在域名graphql ruby下,所以我不确定它们是否是同一个,在我之前查看lookahead时,一堆web崩溃了!highfive.png,这里也一样:)我认为这是一样的,
gem安装graphql
(从未检查过,但我认为没有其他人为ruby实现了整个gql,所以它现在是一种标准)太棒了,谢谢分享gem-看起来非常有用!
calendarAppts {
  appointmentTime
  account {
    id
    name
  }
}