如果Ruby on Rails中存在外键,如何删除外键?

时间:2016-11-07 14:41:38

标签: ruby-on-rails

在ActionRecord中有一个名为index_exists?的函数,但在Rails 4.2.7上没有foreign_key_exists?

因此,当我在某些数据库上调用remove_foreign_key :parties, :franchise_groups时,它会中断。

我应该使用什么?

更新

我的代码

class RemoveForeignKey < ActiveRecord::Migration
  def up
    if foreign_key_exists?(:parties, :franchise_groups)
      remove_foreign_key :parties, :franchise_groups
    end
  end
end

给出错误

== 20161107163800 RemoveForeignKey: migrating =================================
-- foreign_key_exists?(:parties, :franchise_groups)
rake aborted!
An error has occurred, all later migrations canceled:

undefined method `foreign_key_exists?' for #<RemoveForeignKey:0x00000007ea0b58>
/home/rje/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7/lib/active_record/migration.rb:664:in `block in method_missing'

6 个答案:

答案 0 :(得分:6)

  

但没有foreign_key_exists?

There is foreign_key_exists?:)

  

检查给定外来表的表上是否存在外键   关键定义。

# Checks to see if a foreign key exists.
  foreign_key_exists?(:accounts, :branches)
     

# Checks to see if a foreign key on a specified column exists. foreign_key_exists?(:accounts, column: :owner_id)

     

# Checks to see if a foreign key with a custom name exists. foreign_key_exists?(:accounts, name: "special_fk_name")

或者,您可以使用foreign_keys

if foreign_keys(:table_name).include?(foreign_key_name)
  # do stuff
end

答案 1 :(得分:2)

在Rails 4上没有 foreign_key_exists 所以我提出了以下解决方案:

if (top < 0)

答案 2 :(得分:1)

我认为你可以使用这样的东西

def up
  remove_foreign_key :parties, column: :franchise_groups
end

def down
  add_foreign_key :parties, :franchise_groups
end

答案 3 :(得分:1)

它适用于连接:

ActiveRecord::Base.connection.foreign_key_exists?(:parties, :franchise_groups) 

答案 4 :(得分:1)

我的Rails版本似乎没有“foreign_key_exists?” (Rails 4.2.6),所以我使用的是Array#any?搜索“foreign_keys”的结果并确定是否存在给定的外键:

foreign_keys("parties").any?{|k| k[:to_table] == "franchise_groups"}

你可以这样使用它:

if foreign_keys("parties").any?{|k| k[:to_table] == "franchise_groups"}
remove_foreign_key :parties, column: :franchise_group_id
end

答案 5 :(得分:0)

Rails 7+ if_exists / if_not_exists 选项

Rails 7 向 if_exists 添加了 remove_foreign_key 选项,以便在外键已被删除时不会引发错误。

Rails 7 向 if_not_exists 添加了 add_foreign_key 选项,以便在已添加外键时不会引发错误。

因此,可以通过以下方式编写迁移:

class RemoveFranchiseGroupForeignKeysFromParties < ActiveRecord::Migration
  def up
    remove_foreign_key :parties, :franchise_groups, if_exists: true
  end

  def down
    add_foreign_key :parties, :franchise_groups, if_not_exists: true
  end
end

来源: