Данные о посеве с опасностями в Ruby on Rails

У меня есть записи с исходными данными, которые должны находиться в моей базе данных (страны, регионы, перевозчики и т.д.). У меня есть задача rake db: seed, которая будет засеять базу данных.

namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment database." 
  task :seed => :environment do
    require 'active_record/fixtures'

    Dir.glob(RAILS_ROOT + '/db/fixtures/yamls/*.yml').each do |file|
      Fixtures.create_fixtures('db/fixtures/yamls', File.basename(file, '.*'))
    end
  end
end

Я немного волнуюсь, потому что эта задача очищает мою базу данных и загружает исходные данные. Тот факт, что это даже возможно сделать не один раз на производстве, пугает меня дерьмом. Это нормально, и я просто должен быть осторожным? Или люди обычно так или иначе защищают такую ​​задачу?

Ответ 1

Посещение данных с помощью светильников - очень плохая идея.

Светильники не проверяются, и поскольку большинство разработчиков Rails не используют ограничения базы данных, это означает, что вы можете легко получить недопустимые или неполные данные, вставленные в вашу производственную базу данных.

Приборы также устанавливают странные идентификаторы первичного ключа по умолчанию, что не обязательно является проблемой, но раздражает работу.

Есть много решений для этого. Мой личный фаворит - это задача rake, которая запускает Ruby script, который просто использует ActiveRecord для вставки записей. Это то, что Rails 3 будет делать с db:seed, но вы можете легко написать это самостоятельно.

Я дополняю это с помощью метода, который я добавляю к ActiveRecord:: Base под названием create_or_update. Используя это, я могу несколько раз запускать семя script, обновляя старые записи, а не бросая исключение.

Я написал статью об этих методах, а затем вызвал Загрузка данных семян.

Ответ 2

В первой части вашего вопроса, да, я бы поставил некоторые меры предосторожности для выполнения такой задачи в процессе производства. Я поставил такую ​​защиту в моей задаче начальной загрузки/загрузки:

task :exit_or_continue_in_production? do
  if Rails.env.production?
    puts "!!!WARNING!!! This task will DESTROY " +
         "your production database and RESET all " +
         "application settings"
    puts "Continue? y/n"
    continue = STDIN.gets.chomp
    unless continue == 'y'
      puts "Exiting..."
      exit! 
    end
  end
end

Я создал этот смысл для некоторого контекста.

Для второй части вопроса - обычно вам действительно нужны две вещи: a) очень просто посеять базу данных и настроить приложение для разработки и b) загрузочное приложение на производственном сервере (например: вставка пользователя admin, создание приложений для папок зависит от и т.д.).

Я бы использовал приспособления для посева в разработке - все из команды затем видят одни и те же данные в приложении и что в приложении соответствует тому, что в тестах. (Обычно я переношу rake app:bootstrap, rake app:seed rake gems:install и т.д. В rake app:install, чтобы каждый мог работать с этим приложением, просто клонируя репо и выполняя эту одну задачу.)

Я бы никогда не использовал светильники для посева/загрузки на производственном сервере. Rails 'db/seed.rb отлично подходит для этой задачи, но вы можете, конечно, поместить ту же логику в свою собственную задачу rake app:seed, как указывали другие.

Ответ 4

Мы создали кучу лучших практик, которые мы используем для обработки данных. Мы сильно полагаемся на посев, и у нас есть некоторые уникальные требования, так как нам нужно посеять многопользовательские системы. Вот несколько лучших практик, которые мы использовали:

  • Светильники - не лучшее решение, но вы все равно должны хранить ваши данные семян в чем-то, кроме Ruby. Код Ruby для хранения данных семян имеет тенденцию к повторению, а хранение данных в синтаксическом файле означает, что вы можете написать общий код для последовательного обработки ваших семян.
  • Если вы собираетесь обновлять семена, используйте столбец маркера с именем code, чтобы сопоставить ваш файл семян с вашими фактическими данными. Никогда не полагайтесь на соответствие между средами между средами.
  • Подумайте о том, как вы хотите обработать обновление существующих данных семян. Есть ли потенциал, который пользователи модифицировали? Если это так, следует ли сохранять информацию пользователя, а не переопределять его с помощью данных семени?

Если вы заинтересованы в некоторых способах посева, мы упаковали их в драгоценный камень под названием SeedOMatic.

Ответ 5

Как просто удалить задачу с рабочего сервера после того, как вы заселили базу данных?

Ответ 6

У меня просто была интересная идея...

что делать, если вы создали\db\seed\и добавили файлы стиля миграции:

file: 200907301234_add_us_states.rb

class AddUsStates < ActiveRecord::Seeds

  def up
    add_to(:states, [
      {:name => 'Wisconsin', :abbreviation => 'WI', :flower => 'someflower'},
      {:name => 'Louisiana', :abbreviation => 'LA', :flower => 'cypress tree'}
      ]
    end
  end

  def down
    remove_from(:states).based_on(:name).with_values('Wisconsin', 'Louisiana', ...)
  end
end

попеременно:

  def up
    State.create!( :name => ... )
  end

Это позволит вам запускать миграции и семена в порядке, позволяющем им сосуществовать более мирно.

мысли?