web-dev-qa-db-ja.com

Rails移行にいくつかの挿入を追加するにはどうすればよいですか?

(移行により)テーブルを作成した後、いくつかのエントリを直接挿入したいと思います。このための移行を作成するにはどうすればよいですか?

ありがとう

35
xaver23

更新:これは正しい答えです: https://stackoverflow.com/a/2667747/7852


Ruby on Rails api の例です:

 class AddSystemSettings < ActiveRecord::Migration
    # create the table
    def self.up
      create_table :system_settings do |t|
        t.string  :name
        t.string  :label
        t.text  :value
        t.string  :type
        t.integer  :position
      end

      # populate the table
      SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
    end

    def self.down
      drop_table :system_settings
    end
  end
10
Ju Nogueira

しないでください。シードデータを探している場合は、db/seeds.rbおよびrake db:seed代わりに。 このRailscastの詳細

サイドノート:db/seeds.rbはi等です。つまり、シードを再実行しても常に安全である必要があります。

ただし、移行内でデータを挿入または変更する必要がある場合(これには正当なユースケースがあります)、代わりにSQLステートメントを使用することをお勧めします。モデルクラスは、アプリケーションの将来のバージョンでも同じ形式であることが保証されていません。モデルクラスを直接参照すると、将来ゼロから移行を実行するとエラーが発生する可能性があります。

execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
84
Ryan McGeary

編集:注意してください-上記のポスターは正しいので、マイグレーション内にDBを入力しないでください。スキーマの変更の一部としてデータを変更するためだけに、これを新しいデータの追加に使用しないでください。

多くの場合、生のSQLを使用することをお勧めしますが、移行の一部としてデータを挿入する必要がある場合(たとえば、テーブルを複数のテーブルに分割するときにデータ変換を行う)、便利なDBのようなデフォルトのARが必要な場合-独立したエスケープ、モデルクラスのローカルバージョンを定義できます。

class MyMigrationSucksALittle < ActiveRecord::Migration
  class MyModel < ActiveRecord::Base
    # empty guard class, guaranteed to have basic AR behavior
  end

  ### My Migration Stuff Here
  ### ...

end

これは単純な場合に最適に機能することに注意してください。新しいクラスは異なる名前空間(MyMigrationSucksALittle::MyModel)、ガードモデルで宣言されたポリモーフィックな関連付けは正しく機能しません。

利用可能なオプションのより詳細な概要はこちらにあります: http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/

5
David Mayo

047_add_rows_in_system_settings.rbのような新しい移行ファイルを作成します

 class AddRowsInAddSystemSettings < ActiveRecord::Migration
        def self.up
          SystemSetting.create{:name => "name1", :label => "Use notice?", :value => 1}
          SystemSetting.create{:name => "name2", :label => "Use notice?", :value => 2}
         end

        def self.down
          SystemSetting.delete_all
        end
      end

OR

テーブルを作成中

046_system_settings.rb

class AddSystemSettings < ActiveRecord::Migration
    def self.up
      create_table :system_settings do |t|
        t.string  :name
        t.string  :label
        t.text  :value
        t.string  :type
        t.integer  :position
      end

      SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
    end

    def self.down
      drop_table :system_settings
    end
  end

Ref:- http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

4
Salil

Useはシードデータを使用できます。これは素晴らしい方法です! http://railscasts.com/episodes/179-seed-data

0
Jeremie Ges