`Sequel::Error: несоответствующее количество ключей` при запуске миграции с граблей

У меня есть приложение Sinatra, использующее Sequel и грабли для выполнения миграций. Когда я бегу rake db:migrate Я получаю следующую ошибку:

rake aborted!
Sequel::Error: mismatched number of keys: [:rows, :cols] vs [:id]
<path_to_project>/models/grid_pattern.rb:4:in `<class:GridPattern>'

Обходной путь - временно закомментировать эту строку, требующую моих моделей в файле моего приложения:

Dir.glob('./{models}/*.rb').each { |file| require file }

Я знаю, что в дальнейшем я не должен зависеть от моделей в миграциях, но как я могу избежать этого, так как моему приложению нужны модели, а программе rake - приложение?

Моя модель выглядит так:

# grid pattern
class GridPattern < Sequel::Model
  unrestrict_primary_key
  one_to_many :widgets, key: [:rows, :cols]
end

Модель связанных виджетов:

class Widget < Sequel::Model
  many_to_one :grid_pattern, key: [:rows, :cols]
...

Rakefile:

namespace :db do
  desc 'Migrate DB [to version]'
  task :migrate, [:version] do |_t, args|
    ARGV.each { |a| task a.to_sym }
    RACK_ENV = ARGV[1] if ARGV[1]
    require_relative 'app' # DB now set as per RACK_ENV
    db_name = URI(settings.database).path[1..-1]
    if args[:version]
      puts "Migrating '#{db_name}' to version #{args[:version]}"
      Sequel::Migrator.run(DB, 'db/migrations', target: args[:version].to_i)
    else
      puts "Migrating '#{db_name}' to latest"
      Sequel::Migrator.run(DB, 'db/migrations')
    end
  end
end

Файл миграции:

...
create_table :grid_patterns do
  Integer :row
  Integer :col
  primary_key [:row, :col], name: :grids_pk
end

create_table :widgets do
  primary_key :id
  Integer :rows
  Integer :cols
  foreign_key [:rows, :cols], :grid_patterns, name: 'challenges_grid_fkey'
end
...

Как я могу это исправить?

1 ответ

Решение

Ваши миграции не должны требовать кода вашего приложения / модели, они должны только требовать, чтобы DB установлен правильно. Измените код приложения, чтобы вам мог потребоваться отдельный файл, который настраивает DB, а затем загрузить только этот файл при запуске ваших миграций.

Другие вопросы по тегам