Rails 引擎存在外键问题

2024-03-18

我正在开发一个 Rails 引擎,这是我的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'

这是我的迁移文件,当我运行安装命令时,它将复制到我的 Rails 应用程序:

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

在我的 Rails 应用程序中,这是我的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

我省略了引擎的路径,因为它是私有的。

好吧,这是我的问题,当我运行迁移时,使用此配置RAILS_ENV=test rake db:drop db:create db:migrate然后运行我的规格rspec一切正常。

但是当我尝试更新我的 Rails 引擎时4.2.1 in my gem.gemspec and Gemfile像这样:

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使用我的 Engine 的 Rails 应用程序

gem 'rails', '4.2.1'

然后我跑bundle update对于我的引擎和 Rails 应用程序。

当我跑步时RAILS_ENV=test rake db:drop db:create db:migrate迁移效果很好,但是当我尝试运行时rspec我收到与外键相关的错误,如下所示:

== 20150416144229 CreateMpaStorySchema:迁移============================== -- create_table(:mpa_story_archetypes) -> 0.2872s -- create_table(:mpa_story_adjacency_matrices) 耙子中止! StandardError:发生错误,此迁移和所有后续迁移均已取消:

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")

有人知道是否存在与 Rails 4.2.1 和引擎相关的错误吗?


这是因为您的迁移正在生成一个前缀表:mpa_story_archetypes。

两种可能的解决方案:

1 - 当您使用引用方法时显式声明表的...例如:

t.references :mpa_story_archetype, index: true, foreign_key: true

2 - 自行添加foreign_key,删除foreign_key选项t.参考文献并打电话添加外键 method:

add_foreign_key :mpa_story_adjacency_matrices, :mpa_story_archetypes, column: :archetype_id

我更喜欢解决方案 2,并且您必须在每个具有外键

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 引擎存在外键问题 的相关文章

随机推荐

  • PHP Printf 作为浮点精度

    我正在尝试使用 PHPprintf功能打印出用户的存储容量 完整的公式看起来像这样 echo printf 02f size 1024 1024 GB 鉴于 size 10 1024 1024 这应该打印出来 10 00 GB 但事实并非如
  • 读取 byte[] 历史队列

    我正在尝试编写一个我知道数组大小的字节数组 但是我无法解析结果数据 我正在使用以下代码 okAppender writeBytes b gt b write byteData and byte byteData new byte 500 o
  • 如何在phpmyadmin中导入大型sql文件

    我想导入一个大约 12 mb 的 sql 文件 但它在加载时引起问题 有没有办法在不分割sql文件的情况下上传它 尝试根据您的操作系统的口味从 mysql 控制台导入它 mysql u DB USER NAME p DB NAME lt d
  • Spring Boot:禁用特定 URL 的客户端身份验证

    我的配置中有以下配置application yml server address port 8443 sessionTimeout 30 ssl client auth need key store keyStore jks key sto
  • Xamarin iOS 通用链接支持 Twitter 身份验证

    所以 现在 Twitter 从 9 月 25 日开始支持通用链接 这意味着当 UIWebView 命中时https twitter com oauth authorize oauth token https twitter com oaut
  • 仅根据字段名称对类数组进行排序

    我有一个应用程序 用户向我提供字段名称 例如name or costInCents 我必须按该字段排序 我有办法保证字段名称是正确的 这个应用程序导致了我根本无法上课的复杂情况Comparable并实施具体的compareTo 因为自定义实
  • 为用户定义类型实现 ToOwned

    考虑以下示例代码 derive Clone struct DataRef lt a gt text a str derive Clone struct DataOwned text String 我要实施ToOwned for DataRe
  • 如何让 iPhone 应用程序用户提交崩溃报告? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone如何获取客户的崩溃日志 https stackoverflow com questions 3844482 iphone how to get crash log from custome
  • 在 JavaScript 中,当完成通过 new ActiveXObject 创建的对象后,我是否需要将其设置为 null?

    在 WSH 中运行并创建对象 例如 Scripting FileSystemObject 或任何任意 COM 对象 的 Javascript 程序中 完成后是否需要将变量设置为 null 例如 我建议这样做 var fso new Acti
  • 如何将开始按钮放在剪辑的中间

    我在以下位置找到了设计师页面http www videojs com http www videojs com 在那里 您可以将开始按钮的位置更改为剪辑的中间 但我无法在 video js 播放器上放置或使用此样式表 有人可以解释一下如何在
  • C++ 中获取用户输入未执行/跳过的代码

    在下面的代码中 当我尝试让用户输入他们的名字时遇到错误 我的程序只是跳过它并直接进行函数调用 而不允许用户输入他们的名字 尽管出现错误 我的程序仍在编译 我不确定出了什么问题 因为我是根据在这里找到的其他示例编写该部分的 有什么建议么 in
  • 使用 Moneta (JavaMoney) JSR 354 实现自定义货币金额格式

    我真的很困惑如何定制MonetaryAmountFormat使用 Moneta JSR 354 实现 我的目的是能够解析两者1 23 and 3 45 as MonetaryAmounts 这是我的单元测试 Test public void
  • 从 WidgetKit 小部件扩展检测应用程序启动

    点击 WidgetKit 小部件会自动启动其父应用程序 如何检测我的应用程序是否是从其 WidgetKit 小部件扩展启动的 我无法找到任何有关在应用程序中捕获此内容的文档AppDelegate and or SceneDelegate 要
  • 如何使用参数和 POST 方法重定向到外部 url?

    我想在提交到 Flask 中的操作 url 之前保存表单数据
  • 如何在android中打开图库中的一个特定文件夹?

    我使用下面的代码打开 Android 默认图库应用程序 它会打开 sdcard 下的所有图像文件夹 如何只打开一个特定文件夹 Intent intent new Intent Intent ACTION PICK android provi
  • 除非作为参数传入,否则无法添加快速路线

    我正在尝试创建映射其自己的路线的节点模块 我在下面提供了一个简化的示例 删除了返回的对象中映射的所有其他函数以及任何代码以简化示例 我最初的尝试是这样做 文件 web core js function initRoutes app var
  • 具有不同 uv 坐标的 OpenGL ES 1 多重纹理

    我需要使用多重纹理渲染一个对象 但两个纹理对于同一对象具有不同的 uv 坐标 一张是法线贴图 另一张是光照贴图 请提供与此相关的任何有用材料 在 OpenGL ES 2 中 无论如何你都会使用着色器 因此 您可以完全自由地使用您喜欢的任何纹
  • 为 RDBMS(MySQL 数据库)创建 SPARQL 端点的最佳方法

    我正在 想做 一些链接开放数据集的实验 特别是政府推出的实验 我有一个 RDBMS 更具体地说是 MySQL 我设计它时考虑了语义网络的想法 即我将信息存储为对象 谓词和定义对象的类 反过来 所有对象通过主语 gt 谓词 gt 宾语形式的语
  • OpenId + 记住我/保持登录状态

    我有一个问题 关于如何 什么是使用 OpenId 并提供保持登录状态的最佳方法 例如 如果我查看 Stackoverflow 我已经使用 Google 登录 如果我关闭浏览器并返回 它仍然显示我已登录 However 我没有登录谷歌 而且我
  • Rails 引擎存在外键问题

    我正在开发一个 Rails 引擎 这是我的gem gemspec s required ruby version gt 2 0 0 s add dependency rails gt 4 2 0 s add dependency enume