2017-02-15 3 views
0

Sequelとレーキタスクを使用してSinatraアプリを使用して移行を実行しています。私はrake db:migrateを実行すると、私は次のエラーを取得する:レイクからマイグレーションを実行したときに「Sequel :: Error:キーの数が一致しません」

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 } 

私のアプリにはモデルが必要で、レーキタスクにはアプリが必要なので、どうすればこの問題を回避できますか?

私のモデルは次のようになります。

# 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を設定する別のファイルを要求してから、移行を実行するときにそのファイルのみをロードします。

+0

多くのありがとうございますジェレミー、すべての固定& 'Sequel'のおかげで最高のORM – MatzFan

関連する問題