2011-08-08 4 views
13

seeds.rb 대신 YAML 파일을 사용하여 데이터베이스에 초기 데이터를로드하는 방법은 무엇입니까?Ruby on Rails : YAML 파일의 시드 데이터로드

+0

허용 대답은 크지 않다으로 보면 ('테스트 /'디렉토리에 씨앗 데이터를 넣습니다), 그리고 [내 대답 (http://stackoverflow.com/a/24957205/405550) 훨씬 더 upvotes있다, 제발 내 받아 들일 것을 고려하시기 바랍니다? – Zaz

답변

3

체크 아웃기구에 레일 가이드에 루비 :

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

일반적으로, 당신은 test/ 디렉토리에 YAML 픽스처 파일을 만든 다음 rake db:fixtures:load 명령을 사용하여 데이터베이스에로드 할 수 있습니다. 당신이 설비로 할 수있는 모든 멋진 일들에 대한 문서가 여기에 있습니다 :

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
Category.create!(config) 

그런 다음, 단순히 YAML 장소 :

http://api.rubyonrails.org/classes/Fixtures.html

+3

똑같은 것이 개발 또는 생산을 위해 작동합니까? – fijiaaron

+1

마지막 링크가 끊어졌습니다. 또한'test /'에서 시드 데이터를로드하는 것은 올바른 일을하는 것처럼 보이지 않습니다. – Zaz

+0

그것은 나를 불편하게 느끼게하지만 실제로 어떤 사람들은 테스트 목적으로 데이터를 채우기 위해 조명기를 사용합니다. 같은 장소에 yaml 씨를 뿌리는 것이 훨씬 더 ... icky. – jaydel

19

예는 YAML 파일을 구문 분석 db/seeds.rb에 코드를 추가 foo in db/seeds/categories.yml. YAML 파일은 연관 배열 목록이어야합니다 (예 :

).
- name: accessory 
    shortcode: A 

- name: laptop 
    shortcode: L 

- name: server 
    shortcode: S 
+0

이 솔루션의 문제점은'rake db : seed'를 두 번째로 실행하면 시간, 당신은 중복의 무리를 얻을거야. 유일성에 대한 요구 사항에 따라 아마도 마지막 줄을 다음과 같이 수정해야 할 것입니다 :'config.each {| values ​​| Category.first_or_create (values)}' – sberkley

+0

어떤 상황에서 데이터베이스를 두 번 시드 하시겠습니까? 'rake db : reset'은 99 %의 시간을 필요로하는 모든 것을합니다. – Zaz

+2

새 시드 값을 테이블에 추가하거나 시드 값이있는 새 테이블을 추가하는 경우. 전체 데이터베이스를 삭제하는 것은 개발 환경의 솔루션 일 수 있지만 확실히 프로덕션 환경에서는 아닙니다. 다른 테이블에 해당 테이블의 ID에 대한 참조가있는 경우 다시 시드하기 전에 시드 된 테이블을 삭제하는 것도 옵션이 아닙니다. 이전에 시드 된 값을 제거해야하는 경우 상황은 더욱 복잡해지고'rake db : seed' 이상의 해결책이 필요할 수 있습니다. – sberkley

2

@Zaz가 답변을 사용했습니다. 그것은 아주 잘 작동합니다.

하지만 시드 데이터에 문제가있는 경우 (예 : 매우 큰 시드 yaml 파일), yaml의 어느 부분이 잘못되었는지 알고 싶습니다. 그 때 당신은 창조 한 후에 구획을 추가 할 수있다! 이 같은 디버그 :

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
counter = 0 
Category.create!(config) do |c| 
    puts "Create category #{counter += 1} with name: #{c.name}" 
end