Hello,
I've detected a strange issue with 'db:setup' rake task in
comparison with other tasks (like 'db:reset'). This is meant to the core
list because I'd love to know if I am pointing to the right direction, and
since I haven't contributed any patches to rails yet, if what I am guessing
is correct.
I am only including the relevant part for this issue of each file.
First of all, the environment is a 'core' rails project, with mountable
engines. Those engines add their own migrations on engine initialization
process:
# engine_name/lib/engine_name/engine.rb
module EngineName
class Engine < ::Rails::Engine
initializer 'engine_name.inject_migrations' do |app|
config.paths['db/migrate'].expanded.each do |path|
app.config.paths['db/migrate'] << path
end
end
end
end
Given this setup, all rake tasks that do not include :environment precondition
are not going to include this paths on the :load_config call on active record
rake tasks:
# active_record/railties/databases.rake
namespace :db do
task :load_config do
ActiveRecord::Base.configurations =
ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
ActiveRecord::Migrator.migrations_paths =
ActiveRecord::Tasks::DatabaseTasks.migrations_paths
end
end
Which calls ActiveRecord::Tasks::DatabaseTasks.migrations_paths, which leads to:
# active_record/tasks/database_tasks.rb
module ActiveRecord
module Tasks
module DatabaseTasks
def migrations_paths
@migrations_paths ||= Rails.application.paths['db/migrate'].to_a
end
end
end
end
And here is where the "problem" resides. When Rails.application.paths
is resolved is when migrations_paths is initialized. This means that if no
environment is loaded, the engines didn't have the chance to include their
migrations. This is specially important in tasks like 'db:setup',
because the schema will be properly migrated, but when assuming migrating to the
last migration, not every migration will be included in the schema_migrations
table, and will lead to `db:migrate` errors afterwards (table already exists and
similar problems).
So the question is: would make sense that load_config task depends on
environment task? This way we assure that the environment is always loaded.
Thanks in advance.
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to rubyonrails-core+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.