我在 Ruby on Rails SQLite3::ConstraintException: FOREIGN KEY constraint failed 中有这个问题
Posted
技术标签:
【中文标题】我在 Ruby on Rails SQLite3::ConstraintException: FOREIGN KEY constraint failed 中有这个问题【英文标题】:I have this problem in Ruby on Rails SQLite3::ConstraintException: FOREIGN KEY constraint failed 【发布时间】:2021-03-20 17:50:34 【问题描述】:我是 Ruby on Rails 的新手。我尝试制作标签并可以选择删除标签。当我想销毁标签时,我收到此错误 SQLite3::ConstraintException: FOREIGN KEY constraint failed.
ActiveRecord::InvalidForeignKey in TagsController#destroy
这是我在控制器中删除标签的代码:
def destroy
@tag = Tag.find(params[:id])
@tag.destroy
flash.notice = "Tag '#@tag.name' Deleted!"
redirect_to tags_path
end
这是 schema.rb
ActiveRecord::Schema.define(version: 2021_03_20_115719) do
create_table "articles", force: :cascade do |t|
t.string "title"
t.text "body"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
create_table "comments", force: :cascade do |t|
t.string "author_name"
t.text "body"
t.integer "article_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["article_id"], name: "index_comments_on_article_id"
end
create_table "taggings", force: :cascade do |t|
t.integer "tag_id", null: false
t.integer "article_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["article_id"], name: "index_taggings_on_article_id"
t.index ["tag_id"], name: "index_taggings_on_tag_id"
end
create_table "tags", force: :cascade do |t|
t.string "name"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
add_foreign_key "comments", "articles"
add_foreign_key "taggings", "articles"
add_foreign_key "taggings", "tags"
end
【问题讨论】:
您需要为Tag
发布您的schema.rb
资料。很可能您在另一个表中设置了一个约束来引用 Tag
。
@ChristopherOezbek 我用模式填写问题。提前致谢
【参考方案1】:
FOREIGN KEY 约束失败通常意味着您的数据库中有另一条记录仍然有一个belongs_to
关联设置到该记录,因此您不能删除它。
在您的示例中,有一个article
带有您要删除的标签。
create_table "taggings", force: :cascade do |t|
t.integer "tag_id", null: false # << here the association
t.integer "article_id", null: false
# in combination with
add_foreign_key "taggings", "articles"
add_foreign_key "taggings", "tags" # << here the foreign key constraint
您的schema.rb
表明您有一个taggings
连接表,该表将文章与标签连接起来,在此表中,两个属性(tag_id
和article_id
)都不能是nil
,并且必须包含一个有效的标识关联表上的记录的 id。
这意味着当您想要删除特定标签时,您必须首先从taggings
连接表中删除该标签。以下代码应该可以工作:
def destroy
@tag = Tag.find(params[:id])
@tag.articles.clear # << add this line
@tag.destroy
flash.notice = "Tag '#@tag.name' Deleted!"
redirect_to tags_path
end
在Rails Guides 中了解collection.clear
和has_and_belongs_to
关联的一般用法。
【讨论】:
谢谢@spickermann。我用 schema.rb 代码填写了我的问题 @MarcMarc 我在阅读您的数据库架构后更新了我的答案,以便为您的问题提供更具体的解决方案。 非常感谢@spickermann。这对我有帮助,现在可以了。以上是关于我在 Ruby on Rails SQLite3::ConstraintException: FOREIGN KEY constraint failed 中有这个问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Ubuntu 上为 Ruby on Rails 安装 PostgreSQL
Windows / Ruby / Rails安装 - 。无法加载这样的文件--sqlite3 / sqlite3_native windows
如何在 ruby-on-rails 应用程序上使用 Rack 发送 POST 模拟请求?