删除 HABTM 参考中的多个对象 table

Deleting multiple objects in HABTM reference table

我试图销毁数据库中的多条记录 table,其中 :list 列具有相同的名称,但是当我单击“销毁”时出现错误 link:找不到 table 'bookmarks_posts',它说错误在我的控制器行:

if @bookmarks.destroy_all

为什么要加入 table?我该如何改变它?此外,我不想破坏给定书签 table 之外的任何内容。 (我正在使用 sqlite3,如果它改变了什么)

我的 table 迁移:

class CreateBookmarks < ActiveRecord::Migration
  def change
    create_table :bookmarks do |t|
      t.string :list
      t.references :user, index: true, foreign_key: true
      t.references :post, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

我的控制器-销毁并显示:

  def destroy
    @list = Bookmark.find(params[:id])
    @bookmarks = Bookmark.where(:list => @list.list)

    if @bookmarks.destroy_all
        redirect_to bookmarks_url
    end
  end

  def show
    @lists = Bookmark.where(user_id: current_user.id).where(post_id: nil)
    @list = Bookmark.find(params[:id])
    @bookmarks = Bookmark.where.not(post_id: nil).where(list: @list.list)
    @posts = Post.where(:id => @bookmarks.map(&:post_id))
  end

在我的展示视图中,我使用了这个:

<%= link_to 'Destroy', @list, method: :delete %>

我的模特:

class Bookmark < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :posts
end

"Why is it expecting a join table?"

因为您指定了书签和 Post 模型之间的 HABTM 关联。因此,当您删除书签或 Post 时,它会删除连接 table 中引用已删除项目 ID 的所有行。

问题似乎是您在模型中指定了错误的关联类型,或者您创建了错误的迁移来支持 HABTM 关联。

为了便于讨论,我们假设您上面的数据库迁移是正确的,例如:您想要在书签 table 中存储 user_id 和 post_id。这意味着您将具有以下关联:

class Bookmark < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

class User < ActiveRecord::Base
  has_many :bookmarks
end

class Post < ActiveRecord::Base
  has_many :bookmarks
end

如果你真的需要 HABTM 关系,那么你需要做一个 migration that creates a join table

确定所需关联类型的一种方法是记住,如果 table 具有另一个模型的 ID(例如:书签 table 具有 user_id列),那么这是一个 belongs_to 关联。