(移行により)テーブルを作成した後、いくつかのエントリを直接挿入したいと思います。このための移行を作成するにはどうすればよいですか?
ありがとう
更新:これは正しい答えです: 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
しないでください。シードデータを探している場合は、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)"
編集:注意してください-上記のポスターは正しいので、マイグレーション内に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/
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
Useはシードデータを使用できます。これは素晴らしい方法です! http://railscasts.com/episodes/179-seed-data