문제

데이터베이스 (국가, 지역, 운송 업체 등)에 거주 해야하는 초기 데이터가있는 비품이 있습니다. 데이터베이스를 시드하는 작업 레이크 DB : 씨앗이 있습니다.

namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment's database." 
  task :seed => :environment do
    require 'active_record/fixtures'

    Dir.glob(RAILS_ROOT + '/db/fixtures/yamls/*.yml').each do |file|
      Fixtures.create_fixtures('db/fixtures/yamls', File.basename(file, '.*'))
    end
  end
end

이 작업이 데이터베이스를 정리하고 초기 데이터를로드하기 때문에 약간 걱정됩니다. 이것이 생산에서 두 번 이상 할 수 있다는 사실은 저의 쓰레기를 두려워합니다. 이것은 정상입니까? 조심해야합니까? 아니면 사람들이 일반적으로 어떤 식 으로든 이와 같은 과제를 보호합니까?

도움이 되었습니까?

해결책

비품으로 데이터를 파종하는 것은 매우 나쁜 생각입니다.

비품이 검증되지 않았으며 대부분의 Rails 개발자는 데이터베이스 제약 조건을 사용하지 않기 때문에 프로덕션 데이터베이스에 쉽게 삽입되거나 불완전한 데이터를 쉽게 얻을 수 있습니다.

비품은 또한 기본적으로 이상한 기본 키 ID를 설정하는데, 이는 반드시 문제는 아니지만 작업하기가 성가신 일입니다.

이를위한 많은 솔루션이 있습니다. 개인적으로 가장 좋아하는 것은 ActiveRecord를 사용하여 레코드를 삽입하는 Ruby 스크립트를 실행하는 레이크 작업입니다. 이것이 레일 3이 할 일입니다 db:seed, 그러나 당신은 이것을 쉽게 직접 쓸 수 있습니다.

나는 activerecord :: base에 추가 된 방법으로 이것을 보완합니다. create_or_update. 이것을 사용하면 씨앗 스크립트를 여러 번 실행하여 예외를 던지는 대신 오래된 레코드를 업데이트 할 수 있습니다.

나는이 기술들에 관한 기사를 잠시 뒤로 썼다. 종자 데이터로드.

다른 팁

질문의 첫 번째 부분에서는 프로덕션에서 이와 같은 작업을 실행하기위한 예방 조치를 취했습니다. 부트 스트랩/시드 작업에 이와 같은 보호를 넣었습니다.

task :exit_or_continue_in_production? do
  if Rails.env.production?
    puts "!!!WARNING!!! This task will DESTROY " +
         "your production database and RESET all " +
         "application settings"
    puts "Continue? y/n"
    continue = STDIN.gets.chomp
    unless continue == 'y'
      puts "Exiting..."
      exit! 
    end
  end
end

내가 만들었다 이 요점 어떤 맥락에서.

질문의 두 번째 부분의 경우 - 일반적으로 두 가지를 원합니다. a) 데이터베이스를 매우 쉽게 파종하고 개발 응용 프로그램 설정 및 b) 프로덕션 서버에서 응용 프로그램을 부트 스트랩합니다 (예 : 관리자 삽입, 폴더 응용 프로그램 생성 등에 의존합니다).

개발시 파종에 비품을 사용합니다. 팀의 모든 사람이 앱에서 동일한 데이터를보고 앱의 내용은 테스트의 내용과 일치합니다. (보통 나는 포장한다 rake app:bootstrap, rake app:seed rake gems:install, 등 rake app:install 따라서 모든 사람은 저장소를 복제 하고이 하나의 작업을 실행하여 앱에서 작업 할 수 있습니다.)

그러나 프로덕션 서버에서 시드/부트 스트랩을 위해 고정구를 사용하지 않습니다. 울타리' db/seed.rb 이 작업에는 정말 좋지만 물론 동일한 논리를 자신의 rake app:seed 다른 사람들이 지적한 것처럼 과제.

Rails 3은 Seed.rb 파일을 사용하여이를 해결합니다.

http://github.com/brynary/rails/commit/4932F7B38F72104819022BCA0C952BA6F9888CB

우리는 파종에 사용하는 모범 사례를 구축했습니다. 우리는 파종에 크게 의존하며, 멀티 테넌트 시스템을 시드해야하기 때문에 몇 가지 고유 한 요구 사항이 있습니다. 우리가 사용한 모범 사례는 다음과 같습니다.

  1. 비품은 최상의 솔루션이 아니지만 종자 데이터를 루비 이외의 다른 것에 저장해야합니다. 종자 데이터 저장을위한 루비 코드는 반복적 인 경향이 있으며, 파일 파일에 데이터를 저장하면 씨앗을 일관된 방식으로 처리하기 위해 일반 코드를 작성할 수 있습니다.
  2. 씨앗을 잠재적으로 업데이트하려면 다음과 같은 이름의 마커 열을 사용하십시오. code 씨앗 파일을 실제 데이터에 맞추기 위해. 환경간에 일관된 ID에 의존하지 마십시오.
  3. 기존 시드 데이터 업데이트를 처리하는 방법에 대해 생각해보십시오. 사용자 가이 데이터를 수정 한 잠재력이 있습니까? 그렇다면 사용자 정보를 종자 데이터로 재정의하지 않고 유지해야합니까?

우리가 파종하는 방법에 관심이 있다면, 우리는 그것들을 보석에 포장했습니다. 씨앗학.

데이터베이스를 시드하면 프로덕션 서버에서 작업을 삭제하는 것은 어떻습니까?

방금 흥미로운 아이디어가있었습니다 ...

db seeds 를 만들고 마이그레이션 스타일 파일을 추가하면 어떻게해야합니까?

파일 : 200907301234_add_us_states.rb

class AddUsStates < ActiveRecord::Seeds

  def up
    add_to(:states, [
      {:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
      {:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
      ]
    end
  end

  def down
    remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
  end
end

번갈아:

  def up
    State.create!( :name => ... )
  end

이를 통해 더욱 평화롭게 공존 할 수있는 순서대로 마이그레이션과 씨앗을 실행할 수 있습니다.

생각?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top