[#<User id:..] - rails graphql API - why i should add users.to_a in my code

问题描述 投票:0回答:1
def resolve(where: {}, order_by: {'field': 'updated_at', 'direction': 'desc'})
  order_by.symbolize_keys!
  [context[:current_user]] unless context[:current_user].has_capability?(self.class.name.demodulize)
  cap_belongs_to = context[:current_user].determine_capability_belongs_to(self.class.name.demodulize)
  users = if cap_belongs_to[:direct] || context[:current_user].user_type == 'SuperAdmin'
            context[:tenant].users.includes([:groups, :roles]).where(where).order("#{order_by[:field]} #{order_by[:direction]}")
          elsif cap_belongs_to[:group].present?
            context[:tenant].groups.where(cap_belongs_to['group']).map(&:users).flatten
          else
            [context[:current_user]]
          end
  stored_user_contents = (UserContent.select("DISTINCT ON (user_id) user_contents.*"))
  users.to_a
  missing_user_content_ids = users.ids - stored_user_contents.pluck(:user_id)
  missing_user_contents = missing_user_content_ids.map do |user_id|
    UserContent.new(user_id: user_id, on_fly: true)
  end

在上面的代码中如果我删除

users.to_a

从代码中我得到了

[# 的未定义方法“ids”

如何解决上面的问题,下面是我的 graphql 查询

预期是有效的结果,但我的代码中出现错误..

query usersaa {
  users {
    totalCount
    edges {
      node {
        id
        fullName
        firstName
        lastName
        userType
        email
        deletedAt
        createdAt
        updatedAt
        profileImageUrl
        unconfirmedEmail
        courses {
          edges {
            status
            node {
              id
              title
            }
          }
        }
      }
    }
  }
}
ruby-on-rails graphql where-clause resolver toarray
1个回答
0
投票

您遇到的错误,特别是“PG::AmbigouslyColumn”错误,是因为由于删除了 users.to_a 而由 ActiveRecord 生成的 SQL 查询中存在歧义。当您调用 users.to_a 时,它会强制执行查询并从数据库中获取结果。如果没有它,ActiveRecord 仍在构建查询,当您尝试直接从用户关系中 pluck(:id) 时,它无法确定要使用的正确列。

要解决此问题,您可以在使用 pluck(:id) 之前显式调用 to_a 或执行查询,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.