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))
大家好,
当我 运行 一个任务时,我尝试使用 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))