Как добавить несколько вставок в рельсовую миграцию? - PullRequest
35 голосов
/ 19 апреля 2010

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

спасибо

Ответы [ 5 ]

83 голосов
/ 19 апреля 2010

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

Примечание: всегда проверяйте, что код в db/seeds.rb идемпотентен. т.е. всегда должно быть безопасно повторно запустить ваши семена.

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

execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
10 голосов
/ 19 апреля 2010

Обновление: Это правильный ответ: 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
5 голосов
/ 14 мая 2014

Редактировать: ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ - Постеры выше верны, вы не должны заполнять БД внутри миграций. Не используйте это для добавления новых данных, только для изменения данных как части изменения схемы.

Во многих случаях предпочтительнее использовать необработанный SQL, но если вам нужно вставить данные как часть миграции (например, выполнить преобразование данных при разбивке таблицы на несколько таблиц), и вам нужны некоторые вещи 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/

4 голосов
/ 19 апреля 2010

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

Ссылка: - http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

0 голосов
/ 08 апреля 2014

Использование может использовать начальные данные, это отличный способ для этого! http://railscasts.com/episodes/179-seed-data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...