문제

레일 앱에서 초기 데이터를 채우는 갈퀴 작업이 있습니다. 예를 들어, 국가, 주, 이동 통신사 등

내가 지금 설정 한 방식은 /db /fixtures의 파일과 처리하는 갈퀴 작업에 많은 생성 진술이 있다는 것입니다. 예를 들어, 내가 가진 하나의 모델은 테마입니다. 테마가 있습니다.

Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
                      :component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
                      :cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
                      :component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
                      :join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)

Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
                      :component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
                      :join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
                      :cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"

여기서 아이디어는 사용자가 시작할 수 있도록 몇 가지 스톡 테마를 설치하고 싶다는 것입니다. 이 방법에 문제가 있습니다.

ID 설정은 작동하지 않습니다. 즉, 테마를 추가하기로 결정한 경우 '빨간색'이라고 부르겠습니다.이 조명기 파일에 테마 문을 추가하고 레이크 작업을 호출하여 데이터베이스를 다시 변경하고 싶습니다. 내가 그렇게한다면, 테마는 다른 객체에 속하고이 재 입력시 신분증의 변경에 따라 모든 링크가 끊어졌습니다.

내 질문은 무엇보다도 데이터베이스 시드를 처리하는 좋은 방법입니까? 이전 게시물에서 이것은 나에게 권장되었습니다.

그렇다면 어떻게 ID를 하드 코딩 할 수 있으며, 그 단점이 있습니까?

그렇지 않다면 데이터베이스를 시드하는 가장 좋은 방법은 무엇입니까?

나는 모범 사례를 통합 한 오랫동안 오랫동안 감사하고 답변을 생각할 것입니다.

도움이 되었습니까?

해결책

이러한 답변은 약간 구식이므로 업데이트 (일부는 여전히 적용되지만).

Rails 2.3.4, db/seeds.rb에 추가 된 간단한 기능

새로운 레이크 작업을 제공합니다

rake db:seed

주, 국가 등과 같은 일반적인 정적 기록을 채우는 데 좋습니다 ...

http://railscasts.com/episodes/179-seed-data

*Seeds.rb 파일 (RailScast 에피소드에서)에 다음을 넣어 DB : Seed Task로 채우도록 이미 만들어 낸 경우 고정구를 사용할 수 있습니다.

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "operating_systems")

Rails 3.x 용 'ActiveRecord :: Fixtures'사용 'Fixtures'대신 'ActiveRecord :: Fixtures'사용

require 'active_record/fixtures'
ActiveRecord::Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "fixtures_file_name")

다른 팁

일반적으로 두 가지 유형의 종자 데이터가 필요합니다.

  • 기본적인 정보 응용 프로그램의 핵심이 의존 할 수 있습니다. 나는 이것을 일반적인 씨앗이라고 부릅니다.
  • 환경 데이터, 예를 들어 앱을 개발하려면 우리가 앱에서 로컬로 작업하는 데 사용할 수있는 알려진 상태에 많은 데이터를 갖는 것이 유용합니다 (위의 공장 소녀 답변은 이러한 종류의 데이터를 다룹니다).

내 경험상 나는 항상이 두 가지 유형의 데이터에 대한 필요성을 발견했습니다. 그래서 나는 함께했습니다 레일의 씨앗을 연장하는 작은 보석 DB/SEEDS/DB/SEEDS/ENV에 따라 DB/SEEDS/ENV에 따라 여러 공통 종자 파일을 추가 할 수 있습니다.

이 접근법이 내 시드 데이터를 약간의 구조로 제공하기에 충분하다는 것을 알았으며, 실행하기 만하면 알려진 상태로 개발 또는 준비 환경을 설정할 수있는 힘을 제공합니다.

rake db:setup

정기는 일반 SQL 덤프와 마찬가지로 보조금이 깨지기 쉬우 며 보수가 어둡습니다.

factory_bot 당신이 달성하려는 일을 할 것 같습니다. 기본 정의에서 모든 공통 속성을 정의한 다음 생성 시간에이를 대체 할 수 있습니다. 신분증을 공장으로 전달할 수도 있습니다.

Factory.define :theme do |t|
  t.background_color '0x000000'
  t.title_text_color '0x000000',
  t.component_theme_color '0x000000'
  t.carrier_select_color '0x000000'
  t.label_text_color '0x000000',
  t.join_upper_gradient '0x000000'
  t.join_lower_gradient '0x000000'
  t.join_text_color '0x000000',
  t.cancel_link_color '0x000000'
  t.border_color '0x000000'
  t.carrier_text_color '0x000000'
  t.public true
end

Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5')
Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5')
Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC')

Faker와 함께 사용하면 비품 (Yuck)을 엉망으로 만들지 않고도 데이터베이스를 실제로 연결할 수 있습니다.

갈퀴 작업에 이와 같은 코드가 있습니다.

100.times do
    Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)])
end

사용 seeds.rb 파일 또는 FactoryBot 훌륭하지만 고정 된 데이터 구조 및 테스트에 각각 훌륭합니다.

그만큼 seedbank 보석은 씨앗에 더 많은 통제력과 모듈성을 제공 할 수 있습니다. 레이크 작업을 삽입하고 씨앗 사이의 종속성을 정의 할 수도 있습니다. 레이크 작업 목록에는 다음이 추가됩니다 (예 :

rake db:seed                    # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env.
rake db:seed:bar                # Load the seed data from db/seeds/bar.seeds.rb
rake db:seed:common             # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb.
rake db:seed:development        # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb.
rake db:seed:development:users  # Load the seed data from db/seeds/development/users.seeds.rb
rake db:seed:foo                # Load the seed data from db/seeds/foo.seeds.rb
rake db:seed:original           # Load the seed data from db/seeds.rb

Rails는 설명 된대로 데이터를 종자하는 방식으로 내장되어 있습니다. 여기.

또 다른 방법은 보석을 사용하여 다음과 같은보다 고급 또는 쉬운 시드를 위해 보석을 사용하는 것입니다. 시드 뱅크.

이 보석의 주요 장점과 내가 사용하는 이유는 데이터 로딩 종속성 및 환경 시드 데이터와 같은 고급 기능이 있기 때문입니다.

이 답변이 Google에서 처음으로 최신 답변을 추가했습니다.

데이터베이스 마이그레이션에 추가하면 모든 사람이 업데이트 할 때 얻을 수 있습니다. Ruby/Rails 코드에서 모든 논리를 처리하므로 명시 적 ID 설정을 엉망으로 만들 필요가 없습니다.

가장 좋은 방법은 비품을 사용하는 것입니다.

참고 : 비품은 직접 인서트를 사용하고 모델을 사용하지 않으므로 데이터를 채우는 콜백이있는 경우 해결 방법을 찾아야합니다.

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