2009-12-08 2 views
0

배열의 속성 바꾸기 :레일 내가 필리핀에서 잘못된 도시 이름의 목록이

>> a = City.find_all_by_country_id(4) 

=> [#<City id: 91, name: "Alaminos", country_id: 4, created_at: "2009-11-12 04:06:14", updated_at: "2009-11-12 04:06:14">, #<City id: 92, name: "Angeles", country_id: 4, created_at: "2009-11-12 04:06:14", ... 

을 그리고 올바른 모든 이름을 대체하기 위해 원 :

=> b = ["Abra", "Agusan del Norte", "Agusan del Sur", ... 

내가 사용하고 싶었을 메서드는 기존 도시 ID를 업데이트하고 싶을 때만 삽입/자릅니다.

그러나 a은 배열 배열입니다 (제가 틀렸다면 수정하십시오). b은 단순하고 실제적인 배열입니다.

답변

0

a은 City 모델의 배열이어야합니다. 예를 들어 도시 ID 91 (첫 번째 레코드)의 도시 이름을 "Abra"(배열의 첫 번째 요소)로 변경하려면 a[0].name = b[0]을 사용합니다. 저는 정확히 당신이 무엇을하려고하는지에 대해 조금 불명확 합니다만, 이것은 문제의 문법 부분에 대해 알려줄 것입니다.

+0

I 돈 ID를 마이그레이션 파일에 하드 코딩해야하므로 개발 데이터베이스 또는 프로덕션 데이터베이스에 관계없이 데이터베이스 독립적입니다. – Khairul

0

Array#zipActiveRecord::Base#update_attribute에서 확인하십시오. Andy Gaskell이 지적했듯이, a는 City 객체의 배열입니다. 그래서 zip은 a에서 호출 할 수 있으며, update_attribute는 a의 모든 요소에서 호출 할 수 있습니다.

당신이 원하는 일을 짧은 간단한 방법은 이것이다 :

a.zip(b){|array| array[0].update_attribute(:name, array[1])} 

우편 번호는 배열의 배열에 여러 배열을 켜집니다. 여기서 새로운 배열의 각 인덱스는 동일한 인덱스의 소스 배열에있는 요소로 구성된 배열입니다.

a.zip(b) = C#=> ∀i: c[i] = [a[i],b[i]] 

블록을 압축으로 전달하면 Ruby는 c의 각 배열을 블록으로 반환합니다. a.zip(b).collect(&block)을위한 편리한 바로 가기입니다.

위 코드에서 array[0] = a[i]array[1] = b[i]의 각 반복은 i의 다른 값을 제공합니다. update_attributes는 유효성 검사 및 콜백을 우회하여 데이터베이스의 레코드를 업데이트합니다.

주의 사항 :

  • B가있는 경우 더 많은 요소 그런 다음 당신은 어떤 방법 오류를 얻을 것입니다.
  • a가 b보다 많은 요소를 갖는 경우 추가 요소의 이름은 ""로 설정됩니다.
  • 다시 Update_attributes는 유효성 검사를 무시하고 업데이트 된 레코드를 자동 저장합니다. 이 너무없는 경우 당신이 블록의 내장을 대체 할 수 좋아 :

    array[0].name = array[1]; array[0].save 
    
0

내가 대신 마이그레이션 파일을 사용하기로 결정, 그래서 이것은 코드입니다 :

class AddProvinces < ActiveRecord::Migration 
    def self.up 
    philippines = Country.find_by_name('Philippines') 
    old_cities = philippines.cities 
    new_cities = (['Abra', 'Agusan del Norte', 'And all the cities...']) 

    old_cities.each do |c| 
     unless new_cities.blank? 
     City.update(c.id, :name => new_cities.first) 
     new_cities.delete(new_cities.first) 
     else 
     City.delete(c.id) 
     end 
    end 

    unless new_cities.blank? 
     new_cities.each do |c| 
     City.create(:name => c, :country_id => 'philippines.id') 
     end 
    end 
    end 

    def self.down 
    end 
end 
관련 문제