外键约束,博客文章,acts_as_votable

Posted

技术标签:

【中文标题】外键约束,博客文章,acts_as_votable【英文标题】:foreign key constraint, blog post, acts_as_votable 【发布时间】:2018-09-06 16:57:46 【问题描述】:

所以我安装了 gemacts_as_votable 或其他任何名称。很棒的小投票系统。但是,在我的管理员中,当我删除博客文章时,我收到一个外键约束失败的 sqlite 错误消息。我知道这与 db 表有关,如果您尝试删除一个表上的记录,该表在另一个表上具有外键,则会导致问题,除非为外键定义了 on_delete: :cascade 等。我是不知道如何为acts_as_votable gem 做到这一点。有人知道吗?谢谢!

博客模型:

class HomeBlog < ApplicationRecord
  mount_uploader :image, ImageUploader
  has_many :hashtaggings
  has_many :hashtags, through: :hashtaggings

  acts_as_votable

  def all_hashes=(names)
    self.hashtags = names.split(",").map do |name|
      Hashtag.where(name: name.strip).first_or_create!
    end
  end

  def all_hashes
    self.hashtags.map(&:name).join(", ")
  end
end

博客控制器:

class Admin::HomeBlogsController < Admin::AdminController

  before_action :set_home_blog, only: [:show, :destroy]


  def destroy
    @admin_home_blog.destroy!
    respond_to do |format|
      format.html  redirect_to admin_home_blogs_path, notice: 'Blog post was successfully deleted.' 
      format.json  head :no_content 
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_home_blog
      @admin_home_blog = Admin::HomeBlog.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def admin_home_blog_params
      params.require(:home_blog).permit(:name, :entry, :image, :all_hashes)
    end
  end

页面浏览量:

<h3 id="blog-index-title">Blog Posts</h3>


<span class="pagination"><%= will_paginate @admin_home_blogs %></span>
<% @admin_home_blogs.each do |h| %>

<div id="admin-blog-index">
  <%= link_to h.name, h %> | <button type="button"><%= link_to "delete", admin_home_blog_path(h), :style=>'color:white', method: :delete, data: confirm: "Are you sure?"%></button>
</div><br />
<% end %>

错误信息:

SQLite3::ConstraintException: FOREIGN KEY 约束失败:DELETE FROM "home_blogs" WHERE "home_blogs"."id" = ?

【问题讨论】:

您能否分享您要删除的帖子模型或博客模型,或者如果错误突出显示其他内容,请将其添加到问题中,以便我们尝试提供帮助。 @Rockwell Rice,我用来自不同地方的代码更新了这个问题。希望能散发出更多的光芒。谢谢! 【参考方案1】:

我认为这个问题是您需要在删除帖子时销毁依赖该帖子的记录。

... 

has_many :hashtaggings, dependent: :destroy
has_many :hashtags, through: :hashtaggings, dependent: :destroy

...

【讨论】:

在我尝试生成与您在模型中的答案类似的迁移之前,我也认为是这样。然而这并没有奏效。我刚刚删除了迁移,在模型中尝试了你的依赖::destroy 仍然没有运气......同样的错误。 所以有一种关系正在阻止这种情况。还有哪些关系涉及博客文章? 感谢@Rockwell Rice。我解决了。删除了一些我最终不需要的旧表,并从一个我不需要它的表中删除了一个名为 home_blog_id 的列,这就成功了。呸!避免了危机,直到下一个...

以上是关于外键约束,博客文章,acts_as_votable的主要内容,如果未能解决你的问题,请参考以下文章

外键 Laravel 8 foreignId + 约束 - 无法添加或更新子行:外键约束失败

Mysql的外键约束内外连接查询以及锁

MySQL数据库约束,表的设计

Mysql2外键约束,多表/子查询,事务

外键约束和建模

Linux云计算-MySQL-表操作-索引-外键-视图