После создания таблицы (путем миграции) я хочу вставить некоторые записи напрямую. Как мне написать миграцию для этого?
спасибо
После создания таблицы (путем миграции) я хочу вставить некоторые записи напрямую. Как мне написать миграцию для этого?
спасибо
Update: Это правильный ответ: fooobar.com/questions/190716/...
Здесь приведен пример из 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.
Но, если вы должны вставлять или изменять данные внутри миграции, лучше использовать SQL-запросы. Ваш модельный класс не гарантированно будет находиться в одной и той же форме в будущей версии вашего приложения, а запуск миграции с нуля в будущем может привести к ошибкам, если вы напрямую ссылаетесь на класс модели.
execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
Изменить: ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ - плакаты, приведенные выше, верны, вы не должны заполнять DB внутри миграций. Не используйте это для добавления новых данных, только для изменения данных как части изменения схемы.
Для многих вещей предпочтительным будет использование raw SQL, но если вам нужно вставить данные как часть миграции (например, делая преобразование данных при разрыве таблицы на несколько таблиц), и вы хотите, чтобы некоторые файлы AR по умолчанию как удобное DB-независимое экранирование, вы можете определить локальную версию класса модели:
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
ИЛИ
при создании таблицы
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
Ссылка: - http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Использование может использовать данные семени, это отличный способ для этого! http://railscasts.com/episodes/179-seed-data