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

时间:2016-04-05 15:04:24

标签: ruby-on-rails ruby-on-rails-4 sqlite3-ruby

我试图在我的数据库表中销毁多个记录,其中:list列具有相同的名称,但是当我点击Destroy链接时出现错误:找不到表'bookmarks_posts',它说错误在我的控制器中行:

if @bookmarks.destroy_all

为什么期待连接表?我怎么能改变呢?此外,我不想破坏给定书签表之外的任何东西。 (我正在使用sqlite3,如果它改变了什么)

我的表格迁移:

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

1 个答案:

答案 0 :(得分:0)

&#34;为什么期待联接表?&#34;

因为您已在Bookmark和Post模型之间指定了HABTM关联。因此,当您删除书签或帖子时,它希望删除连接表中引用已删除项目ID的任何行。

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

为了便于讨论,我们假设上面的数据库迁移是正确的,例如:您希望在Bookmarks表中存储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

找出所需关联类型的一种方法是记住,如果表具有另一个模型的ID(例如:Bookmarks表具有user_id列),那么这是belongs_to关联。