Rails BSON::ObjectId 类型的值不能写入 Array 类型的字段



Helo everyone,

当我运行任务时,我尝试访问带有轨道和 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

所以Mongoid希望在您分配给school_premium_asides时看到数组。但是在你的耙子任务中,你有:

school.update(school_premium_asides: sa.id)

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

BSON::ObjectId 类型的值不能写入数组类型的字段

错误来自。

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

@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))