我试图在我的数据库表中销毁多个记录,其中: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
答案 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
关联。