删除 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
关联。
我试图销毁数据库中的多条记录 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
关联。