【问题标题】:Rails InvalidForeignKeyRails InvalidForeignKey
【发布时间】:2017-10-19 20:50:40
【问题描述】:

我正在为我的网站开发一个作品集,我决定为每个作品集项目添加技能。

class PortfolioSkill < ApplicationRecord
  belongs_to :portfolio
  belongs_to :skill
end

class Portfolio < ApplicationRecord

  has_many :portfolio_skills
  has_many :skills, through: :portfolio_skills


  def all_tags=(names)
    self.skills = names.split(",").map do |name|
      Skill.where(name: name.strip).first_or_create!
  end
end

 def all_tags
  self.skills.map(&:name).join(", ")
 end

 def remove_skill_tags
    PortfolioSkill.where(portfolio_id: id).destroy_all
 end


end



 create_table "portfolio_skills", force: :cascade do |t|
     t.integer "portfolio_id"
     t.integer "skill_id"
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
     t.index ["portfolio_id"], name:     "index_portfolio_skills_on_portfolio_id"
     t.index ["skill_id"], name: "index_portfolio_skills_on_skill_id"
  end

create_table "portfolios", force: :cascade do |t|
    t.string "name"
    t.string "client"
    t.date "completed"
    t.text "about"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "long_landscape"
    t.string "cover"
    t.integer "category_id"
    t.index ["category_id"], name: "index_portfolios_on_category_id"
  end

当我在索引页面上单击销毁时,我得到了

SQLite3::ConstraintException: FOREIGN KEY constraint failed: DELETE FROM "portfolios" WHERE "portfolios"."id" = ?

错误。所有的关联看起来都是正确的。我在其他模型上为我的标签使用了相同的模式,并且没有问题。任何帮助都会很棒。

【问题讨论】:

    标签: ruby-on-rails sqlite rails-activerecord


    【解决方案1】:

    您正在从投资组合表中删除,但表投资组合技能有一个列将其作为外键引用。因此出现错误。

    尝试删除父级而不检查和删除其关联的子级可能会导致数据不一致。这个例外是为了防止这种情况发生。

    依赖于 Rails 的销毁将负责在删除父项时删除关联的子行。

    尝试使用依赖销毁:-

    class Portfolio < ApplicationRecord
      has_many :portfolio_skills, :dependent => :destroy
      ...
    end
    

    【讨论】:

    • 你能详细解释一下吗?我详细说明了它的工作原理,但我仍然不知道为什么。
    • 发生的情况是,当您删除投资组合时,投资组合 _skills 表中仍然存在与该投资组合的关联。使用 :dependent => destroy,您还删除了这些依赖项。你是说,'当我删除一个投资组合时,也要删除与之关联的投资组合技能。'
    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2020-10-19
    • 2020-06-22
    • 2021-09-07
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多