QueueClassic / queue_classic_admin

An admin interface for QueueClassic
MIT License
23 stars 18 forks source link

Duplicate migration when migrating in Rails 3.2.20 #26

Open h0jeZvgoxFepBQ2C opened 9 years ago

h0jeZvgoxFepBQ2C commented 9 years ago

Hey,

I'm using the support-v2 branch, creating the migrations for a rails 3.2.20 app.

Creation works fine, but migrating doesnt work: I dont use the queue-classic-later gem and there are no duplicate migrations with this names.. but i still get this exception:

Any hints?

** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:migrate
rake aborted!
ActiveRecord::DuplicateMigrationNameError: Multiple migrations have the name AddIdToLater
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:637:in `block in migrations'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:629:in `map'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:629:in `migrations'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:734:in `migrations'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:685:in `migrate'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:570:in `up'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/migration.rb:551:in `migrate'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/activerecord-3.2.20/lib/active_record/railties/databases.rake:193:in `block (2 levels) in <top (required)>'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:240:in `call'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:240:in `block in execute'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:235:in `each'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:235:in `execute'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain'
/Users/myuser/.rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:172:in `invoke_with_call_chain'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/task.rb:165:in `invoke'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:150:in `invoke_task'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:106:in `each'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:106:in `block in top_level'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:115:in `run_with_threads'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:100:in `top_level'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:78:in `block in run'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/lib/rake/application.rb:75:in `run'
/Users/myuser/.rvm/gems/ruby-2.1.3/gems/rake-10.3.2/bin/rake:33:in `<top (required)>'
/Users/myuser/.rvm/gems/ruby-2.1.3/bin/rake:23:in `load'
/Users/myuser/.rvm/gems/ruby-2.1.3/bin/rake:23:in `<main>'
/Users/myuser/.rvm/gems/ruby-2.1.3/bin/ruby_executable_hooks:15:in `eval'
/Users/myuser/.rvm/gems/ruby-2.1.3/bin/ruby_executable_hooks:15:in `<main>'
jipiboily commented 9 years ago

Are you getting this when trying to develop something for queue_classic_admin or when using it in your project? Just to be sure.

If this is in one of your app, which is what I assume, how do you proceed to get it installed?

abevoelker commented 9 years ago

I also got this same weird error in a Rails 4.2 app in my development environment. I was able to get the migrations to run on my test environment by recreating the test database with RAILS_ENV=test rake db:drop db:create db:migrate. Then to get past it for development, I just deleted the migrations because I don't use queue_classic-later.

jipiboily commented 9 years ago

Interesting. If you could give some repro steps or app, it would be great.

abevoelker commented 9 years ago

Sure, the main thing is you need to have some migrations that already exist in the database. Starting from a fresh database doesn't seem to trigger it. Here's some exact repro steps:

git clone https://github.com/abevoelker/queue_classic_admin-bugrepro.git
cd queue_classic_admin-bugrepro
bundle
rake db:create db:migrate
rake queue_classic_admin:install:migrations
rake db:migrate
abevoelker commented 9 years ago

I don't know if it would fix it or not, but if it's the ActiveRecord::Base.connection.table_exists? that is causing the problem, you could do a raw SQL migration with execute and check for existence of the table in the actual SQL. If you're relying on a Postgres version >= 9.2 (which I think you are, due to the json data type), then the ALTER TABLE IF EXISTS syntax that was introduced in 9.2 may be useful.

jacobmendoza commented 9 years ago

Hey,

I don't have too much experience with Queue Classic. Hope not to be misleading. The error doesn't seem to be related to SQL and just to the mere fact that the migration is duplicated. The rake task copies the files to the rails application migration folder. Also, exists an initializer in /lib/queue_classic_admin/engine.rb that adds the migrations of this folder to the app folder.

Aren't this two steps somehow incompatible?. When applying the migrations, rails will look in this two places, the rails application migrations folder and also the gem migrations folder, throwing the error. Pretty sure that I'm missing something, but I'd be very grateful if somebody can help me to understand better.

Thanks to @abevoelker for the repro steps.

johnkolen commented 2 years ago

I ran into the same issue with Rails 7. What's interesting is that once the queue_classic_admin gem is installed, rake db:migrate fails. That is without calling the rake task. I'm guessing that the duplication is self inflicted. The install rake task copies the internal AddIdToLater migration to the local migration directory. For some reason the source directory is also in the path for possible migration files.

bundle install # remove queue_classic_admin gem
db:migrate # works
bundle install # add queue_classic_admin gem
db:migrate # fails
rake aborted!
StandardError: Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Active Record release the migration was written for:

  class AddIdToLater < ActiveRecord::Migration[7.0]
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:561:in `inherited'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/queue_classic_admin-0.0.13/db/migrate/20130626182618_add_id_to_later.rb:1:in `<main>'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1056:in `load'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1056:in `load_migration'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1050:in `migration'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1046:in `disable_ddl_transaction'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1418:in `use_transaction?'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1365:in `rescue in execute_migration_in_transaction'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1353:in `execute_migration_in_transaction'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1333:in `each'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1333:in `migrate_without_lock'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1282:in `block in migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1432:in `block in with_advisory_lock'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:215:in `with_connection'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1447:in `with_advisory_lock_connection'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1428:in `with_advisory_lock'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1282:in `migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1117:in `up'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1092:in `migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/tasks/database_tasks.rb:262:in `migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/railties/databases.rake:92:in `block (2 levels) in <main>'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'

Caused by:
StandardError: Directly inheriting from ActiveRecord::Migration is not supported. Please specify the Active Record release the migration was written for:

  class AddIdToLater < ActiveRecord::Migration[7.0]
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:561:in `inherited'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/queue_classic_admin-0.0.13/db/migrate/20130626182618_add_id_to_later.rb:1:in `<main>'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1056:in `load'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1056:in `load_migration'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1050:in `migration'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1046:in `disable_ddl_transaction'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1418:in `use_transaction?'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1410:in `ddl_transaction'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1359:in `execute_migration_in_transaction'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1333:in `each'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1333:in `migrate_without_lock'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1282:in `block in migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1432:in `block in with_advisory_lock'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:215:in `with_connection'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1447:in `with_advisory_lock_connection'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1428:in `with_advisory_lock'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1282:in `migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1117:in `up'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/migration.rb:1092:in `migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/tasks/database_tasks.rb:262:in `migrate'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/activerecord-7.0.3.1/lib/active_record/railties/databases.rake:92:in `block (2 levels) in <main>'
/Users/johnkolen/.rvm/gems/ruby-3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:migrate