Rails Motors with problems in foreign keys
I am developing a rail engine and this is mine gem.gemspec
s.required_ruby_version = '>= 2.0.0'
s.add_dependency 'rails', '>= 4.2.0'
s.add_dependency 'enumerate_it'
s.add_dependency 'slim-rails'
s.add_dependency 'bootstrap-sass'
s.add_dependency 'jquery-rails'
s.add_development_dependency 'rdoc'
s.add_development_dependency 'tomdoc'
s.add_development_dependency 'sqlite3'
s.add_development_dependency 'rspec-rails'
s.add_development_dependency 'timecop'
s.add_development_dependency 'shoulda-matchers'
s.add_development_dependency 'factory_girl_rails'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'awesome_print'
s.add_development_dependency 'guard'
s.add_development_dependency 'guard-rspec'
s.add_development_dependency 'guard-migrate'
s.add_development_dependency 'guard-livereload'
s.add_development_dependency 'thor'
s.add_development_dependency 'simplecov'
s.add_development_dependency 'codeclimate-test-reporter'
This is my migration file, which will be copied to my rails app when I run the install command:
class CreateMpaStorySchema < ActiveRecord::Migration
def change
create_table :mpa_story_archetypes do |t|
t.string :name
t.string :api_name
t.string :api_key
t.text :description
t.integer :kind, index: true
t.integer :tier, index: true
t.integer :execution, index: true
t.integer :interaction, index: true
t.string :klass
t.integer :expected_runtime
t.timestamps null: false
end
create_table :mpa_story_adjacency_matrices do |t|
t.references :archetype, index: true, foreign_key: true
t.integer :kind, index: true
t.integer :predecessor_id, index: true
t.integer :successor_id, index: true
t.integer :branch, default: 0
t.timestamps null: false
end
create_table :mpa_story_instances do |t|
t.integer :status, index: true
t.text :artifacts
t.timestamps null: false
end
create_table :mpa_story_instance_steps do |t|
t.references :archetype, index: true, foreign_key: true
t.references :instance, index: true, foreign_key: true
t.integer :kind, index: true
t.integer :elapsed_time
t.timestamps null: false
end
create_table :mpa_story_instance_artifacts do |t|
t.references :instance, index: true, foreign_key: true
t.string :klass, index: true, foreign_key: true
t.text :value
t.timestamps null: false
end
create_table :mpa_story_protocol_parameters do |t|
t.references :archetype, index: true, foreign_key: true
t.integer :interaction, index: true
t.string :klass
t.integer :kind, index: true
t.string :parameter
t.timestamps null: false
end
create_table :mpa_story_archetypes_instances, id: false do |t|
t.references :archetype, index: true, foreign_key: true
t.references :instance, index: true, foreign_key: true
end
create_table :mpa_story_dynamic_routes do |t|
t.references :archetype, index: true, foreign_key: true
t.string :name
t.text :actions
t.timestamps null: false
end
create_table :mpa_story_dynamic_actions do |t|
t.references :dynamic_route, index: true, foreign_key: true
t.integer :kind, index: true
t.string :name
t.string :http_method
t.timestamps null: false
end
create_table :mpa_story_business_rules do |t|
t.references :archetype, index: true, foreign_key: true
t.string :api_key, index: true
t.timestamps null: false
end
create_table :mpa_story_notifications do |t|
t.references :archetype, index: true, foreign_key: true
t.string :api_key, index: true
t.timestamps null: false
end
add_index :mpa_story_archetypes, :api_name, unique: true
add_index :mpa_story_archetypes, :api_key, unique: true
create_table :mpa_story_comments do |t|
t.references :archetype, index: true, foreign_key: true
t.string :name
t.text :comment
t.integer :parent_id, index: true
t.integer :lft, index: true
t.integer :rgt, index: true
t.integer :depth
t.timestamps null: false
end
end
end
In my rails app this is mine Gemfile
source 'https://rubygems.org'
# not used yet! source 'https://rails-assets.org'
ruby '2.2.1'
gem 'rails', '4.2.0'
# Front-end
gem 'sass-rails', '~> 5.0'
gem 'coffee-rails'
gem 'uglifier', '>= 1.3.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'bootstrap-sass', '~> 3.3.1.0'
gem 'autoprefixer-rails', '~> 4.0.2.2'
# View
gem 'simple_form', '~> 3.1.0'
gem 'responders', '~> 2.0.2'
gem 'slim-rails', '~> 3.0.1'
gem 'enumerate_it', '~> 1.2.3'
# Infra
gem 'pg', '~> 0.18.1'
# Auth
gem 'devise', '~> 3.4.1'
gem 'devise-i18n-views', '~> 0.3.3'
gem 'mini_magick'
gem 'refile', require: ['refile/rails', 'refile/image_processing']
gem 'aws-sdk', '< 2.0'
gem 'dotenv-rails'
# Association and form helpers
gem 'cocoon', '>= 1.2.6'
gem 'awesome_nested_set'
group :doc do
gem 'sdoc', require: false
end
group :development, :test do
# Tests
gem 'parallel_tests'
gem 'byebug'
gem 'spring'
gem 'better_errors'
gem 'binding_of_caller'
gem 'meta_request'
gem 'quiet_assets'
gem 'web-console', '~> 2.0'
gem 'guard'
gem 'guard-rspec'
gem 'guard-bundler'
gem 'guard-livereload'
gem 'guard-migrate'
gem 'foreman'
gem 'rspec-rails', '~> 3.1.0'
gem 'teaspoon', '~> 0.8.0'
gem 'shoulda-matchers', '~> 2.7.0'
gem 'fuubar', '~> 2.0.0'
gem 'awesome_print'
gem 'pry-rails'
end
group :test do
gem 'capybara', '~> 2.4.4'
gem 'capybara-screenshot', '~> 1.0.4'
gem 'poltergeist', '~> 1.5.1'
gem 'launchy', '~> 2.4.3'
gem 'database_cleaner', '~> 1.4.0'
gem 'factory_girl_rails', '~> 4.5.0'
gem 'forgery', '~> 0.6.0'
gem 'brazilian_forgery', git: 'https://github.com/internetsistemas/brazilian_forgery.git'
gem 'simplecov', require: false
gem 'codeclimate-test-reporter', require: false
end
group :production do
gem 'rails_12factor'
end
I missed paths for my engine because it is closed.
Well here is my problem, with these configs, when I run my migrations RAILS_ENV=test rake db:drop db:create db:migrate
and then I run my specs rspec
everything works well.
BUT when I try to update my engine for rails 4.2.1
in mine gem.gemspec
and Gemfile
like this:
gem.gemspec
s.required_ruby_version = '~> 2.2'
s.add_dependency 'rails', '>= 4.2.1'
s.add_dependency 'enumerate_it'
s.add_dependency 'slim-rails'
s.add_dependency 'bootstrap-sass'
s.add_dependency 'jquery-rails'
s.add_development_dependency 'rdoc'
s.add_development_dependency 'tomdoc'
s.add_development_dependency 'sqlite3'
s.add_development_dependency 'rspec-rails'
s.add_development_dependency 'timecop'
s.add_development_dependency 'shoulda-matchers'
s.add_development_dependency 'factory_girl_rails'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'awesome_print'
s.add_development_dependency 'guard'
s.add_development_dependency 'guard-rspec'
s.add_development_dependency 'guard-migrate'
s.add_development_dependency 'guard-livereload'
s.add_development_dependency 'thor'
s.add_development_dependency 'simplecov'
s.add_development_dependency 'codeclimate-test-reporter'
Gemfile
of my rails app using my engine
gem 'rails', '4.2.1'
And then I run bundle update
for both, my engine and my rail.
When I run the RAILS_ENV=test rake db:drop db:create db:migrate
migrations work well, but when I try to run rspec
I got foreign key related errors like:
== 20150416144229 CreateMpaStorySchema: transfer =========================== - create_table (: mpa_story_archetypes) -> 0.2872s - create_table (: mpa_story_adjacency_matrices ) the rake is interrupted! StandardError: An error occurred, this and all subsequent migrations have been canceled:
PG::UndefinedTable: ERRO: relação "archetypes" não existe :
ALTER TABLE "mpa_story_adjacency_matrices" ADD CONSTRAINT "fk_rails_2b6894b4f9"
FOREIGN KEY ("archetype_id")
REFERENCES "archetypes" ("id")
Does anyone know if there are any bugs related to rails 4.2.1 and motors?
source to share
This is because your migration generates a prefix table: mpa_story_archetypes.
Two possible solutions:
1 - Explicitly declaring your table when you use the link method ... for example:
t.references :mpa_story_archetype, index: true, foreign_key: true
2 - add foreign_key yourself by removing the foreign_key parameter in t.references and calling the add_foreign_key method :
add_foreign_key :mpa_story_adjacency_matrices, :mpa_story_archetypes, column: :archetype_id
I prefer solution 2 and you must do this on every table with foreign_key
source to share