簡體   English   中英

如果外鍵存在於 Ruby on Rails 中,我該如何刪除它?

[英]How do I drop a foreign key if it exists in Ruby on Rails?

有一個叫index_exists? 在 ActionRecord 中,但沒有foreign_key_exists? 在 Rails 4.2.7 上。

因此,當我在某些數據庫上調用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'

但沒有foreign_key_exists?

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

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

remove_foreign_key :events, column: :subscribers_selector_id if foreign_keys(:events).map(&:column).include?("subscribers_selector_id")

我想你可以使用這樣的東西

def up
  remove_foreign_key :parties, column: :franchise_groups
end

def down
  add_foreign_key :parties, :franchise_groups
end

它適用於連接:

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

我的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

Rails 7+ if_exists / if_not_exists 選項

Rails 7 向remove_foreign_key添加了if_exists選項,以便在外鍵已被刪除時不會引發錯誤。

Rails 7 向add_foreign_key添加了if_not_exists選項,以便在已添加外鍵時不引發錯誤。

因此,遷移可以按以下方式編寫:

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

資料來源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM