Подтвердить что ты не робот

Как добавить некоторые вставки в миграции рельсов?

После создания таблицы (путем миграции) я хочу вставить некоторые записи напрямую. Как мне написать миграцию для этого?

спасибо

4b9b3361

Ответ 1

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

Ответ 2

Не. Если вы ищете семенные данные, вы должны использовать db/seeds.rb и rake db:seed. Дополнительная информация в этом Railscast.

Но, если вы должны вставлять или изменять данные внутри миграции, лучше использовать SQL-запросы. Ваш модельный класс не гарантированно будет находиться в одной и той же форме в будущей версии вашего приложения, а запуск миграции с нуля в будущем может привести к ошибкам, если вы напрямую ссылаетесь на класс модели.

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

Ответ 3

Изменить: ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ - плакаты, приведенные выше, верны, вы не должны заполнять 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/

Ответ 4

создать новый файл миграции, например 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