Rails BSON::ObjectId 类型的值无法写入数组类型的字段

Rails Value of type BSON::ObjectId cannot be written to a field of type Array

大家好,

当我 运行 一个任务时,我尝试使用 rails 和 mongoid 访问一个 BSON Id,但是我有这个错误消息:

Mongoid::Errors::InvalidValue:
message:
  Value of type BSON::ObjectId cannot be written to a field of type Array
summary:
  Tried to set a value of type BSON::ObjectId to a field of type Array
resolution:
  Verify if the value to be set correspond to field definition

我不明白为什么,因为我只是输入一个id, 这是代码:

任务:

namespace :geocodeschool do

  desc "Show premium school near non-premium school and update them"

  task :schgc => :environment do

      @schools = School.all

      def premium_school_aside(school)
        radius = 50
        @schools_a = School.near(school.coordinates.reverse, radius, units: :km)
        @schools_premium = @schools_a.premium_school.limit(3)
      end

      @schools.each do |school|
        premium_school_aside(school)
        puts "// -------------- //"
        puts "AUTO-ÉCOLE : #{school.title}"
        puts "// -------------- //"
        puts "les auto-écoles premiums près de #{school.title} : #{@schools_premium.count}"
        puts "-------"

        @schools_premium.each do |sa|
          puts sa.id
          school.update(school_premium_asides: sa.id)
        end

        puts "-------"

    end

  end

end

模型中的字段:

  field :school_premium_asides, type: Array

有人可以向我解释原因以及如何解决这个问题吗?

你的模型中有这个:

field :school_premium_asides, type: Array

所以当您分配给 school_premium_asides 时,Mongoid 期望看到数组。但是在你的抽佣任务中你有:

school.update(school_premium_asides: sa.id)

并且大概 sa.id 是一个单一的 BSON::ObjectId 值。这意味着您正在尝试将单个 BSON::ObjectId 写入 Array 类型的字段,这就是您的:

Value of type BSON::ObjectId cannot be written to a field of type Array

错误来自。

我不确定你的代码试图做什么,但我认为你想将 @schools_premium 的所有 id 分配给 [=] 中的 school_premium_asides 字段21=]。如果是这样,那么你想替换这个:

@schools_premium.each do |sa|
    puts sa.id
    school.update(school_premium_asides: sa.id)
end

与:

school.update(school_premium_asides: @schools_premium.map(&:id))