2017-02-01 4 views
0

힐로 모두의 필드에 쓸 수 없습니다레일 가치 :: ObjectId가이 유형의 배열

내가 작업을 실행할 때, 레일 및 mongoid와 BSON 이드에 액세스하려고하지만이 오류가 메시지 :

작업 :

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 
0 난 그냥 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 

내가 왜 이해가 안 돼요, 여기 코드입니다

및 모델의 필드 :

field :school_premium_asides, type: Array 

사람이 왜 나를 설명 할 수 있는가, 어떻게이 문제를 해결하려면?

답변

0

당신은 당신의 모델이 있습니다

field :school_premium_asides, type: Array 

그렇게 Mongoid 당신이 school_premium_asides에 할당 할 때 배열을 볼 것으로 예상된다.

school.update(school_premium_asides: sa.id) 

을하고 아마도 sa.id은 하나의 BSON::ObjectId 값은 다음과 같습니다 그러나 다음 레이크 작업에서, 당신은. 즉, 배열 유형의 필드에 하나의 BSON::ObjectId을 쓰기 위해 노력하고 있음을 의미하고 그건 어디 : 형 BSON의

값 :: ObjectId가이 유형의 배열의 필드에 쓸 수 없습니다

오류가 발생합니다.

나는 코드가 일을하려고 무엇 확실하지 않다하지만 난 당신이 schoolschool_premium_asides 필드로 @schools_premium의 모든 id의를 할당 할 생각합니다. 그렇다면 당신은이를 교체하려면 :

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

이 답변에 감사드립니다 :와

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

! 나는 내가하고 싶은 것을 이해하고 있다고 생각하지만, 가장 가까운 3 개의 프리미엄 학교를 배열에 배치하여보기에 표시하고자합니다. 그래서 배열을 만들어서 3 개의 ID로 채우는 것이 더 명확합니다. ? –

+0

가장 가까운 세개의 'school.update (school_premium_asides : those_three_ids_in_an_array)'를 찾아야합니다. 맞습니까? –

+0

하지만 다음과 같은 코드가 있습니다 : '@schools_premium.each do | sa | puts sa.id school.update (school_premium_asides : sa.id) 끝 '작동해야합니까? –