Rails HABTM has_many 销毁错误
Rails HABTM has_many destroy error
我在用户和工作区之间有一个 has_and_belongs_to_many using has_many。
user.rb
class User < ActiveRecord::Base
has_many :user_workspaces, dependent: :destroy
has_many :workspaces, through: :user_workspaces
before_destroy :delete_workspaces
def delete_workspaces
self.workspaces.each(&:destroy)
end
workspace.rb
class Workspace < ActiveRecord::Base
has_many :user_workspaces
has_many :users, through :user_workspaces
end
user_workspaces class 和迁移:
class UserWorkspace < ActiveRecord::Base
self.table_name = "user_workspaces"
belongs_to :user
belongs_to :workspace
end
class CreateUsersAndWorkspaces < ActiveRecord::Migration
def change
create_table :users_workspaces, id: false do |t|
t.belongs_to :user, index: true
t.belongs_to :workspace, index: true
t.boolean :admin, default: true
end
end
end
class RenameUsersWorkspaces < ActiveRecord::Migration
def change
rename_table('users_workspaces', 'user_workspaces')
end
end
我希望这两个测试都通过:
should "destroy all associatios and objects" do
user = User.create!(attributes_for(:user))
w = user.workspaces.create!(attributes_for(:workspace))
user.destroy
assert UserWorkspace.all.empty? #asser there are no associations
end
这给了我错误
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column:
user_workspaces.: DELETE FROM "user_workspaces" WHERE
"user_workspaces"."" = ?
should "destroy association when destroying workspace" do
user = User.create!(attributes_for(:user))
w = user.workspaces.create!(attributes_for(:workspace))
w.destroy
assert UserWorkspace.all.empty?
end
如何涵盖这两种情况?销毁用户会销毁关联和工作空间,销毁工作空间也会销毁关联
根据http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html只需要忽略加入table.
Workspace.rb 现在有依赖销毁,仅销毁连接(销毁的预期行为)
has_many :users, through: :user_workspaces,
inverse_of: :workspaces,
dependent: :destroy
然后 user.rb 保留 delete_workspaces 函数,但添加 dependent::destroy,以破坏关联。
user.rb
before_destroy: :delete_workspaces
has_many :workspaces, through: :user_workspaces,
dependent: :destroy
def delete_workspaces
self.workspaces.each(&:destroy)
end
现在两个测试都通过了。
我在用户和工作区之间有一个 has_and_belongs_to_many using has_many。
user.rb
class User < ActiveRecord::Base
has_many :user_workspaces, dependent: :destroy
has_many :workspaces, through: :user_workspaces
before_destroy :delete_workspaces
def delete_workspaces
self.workspaces.each(&:destroy)
end
workspace.rb
class Workspace < ActiveRecord::Base
has_many :user_workspaces
has_many :users, through :user_workspaces
end
user_workspaces class 和迁移:
class UserWorkspace < ActiveRecord::Base
self.table_name = "user_workspaces"
belongs_to :user
belongs_to :workspace
end
class CreateUsersAndWorkspaces < ActiveRecord::Migration
def change
create_table :users_workspaces, id: false do |t|
t.belongs_to :user, index: true
t.belongs_to :workspace, index: true
t.boolean :admin, default: true
end
end
end
class RenameUsersWorkspaces < ActiveRecord::Migration
def change
rename_table('users_workspaces', 'user_workspaces')
end
end
我希望这两个测试都通过:
should "destroy all associatios and objects" do
user = User.create!(attributes_for(:user))
w = user.workspaces.create!(attributes_for(:workspace))
user.destroy
assert UserWorkspace.all.empty? #asser there are no associations
end
这给了我错误
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: user_workspaces.: DELETE FROM "user_workspaces" WHERE "user_workspaces"."" = ?
should "destroy association when destroying workspace" do
user = User.create!(attributes_for(:user))
w = user.workspaces.create!(attributes_for(:workspace))
w.destroy
assert UserWorkspace.all.empty?
end
如何涵盖这两种情况?销毁用户会销毁关联和工作空间,销毁工作空间也会销毁关联
根据http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html只需要忽略加入table.
Workspace.rb 现在有依赖销毁,仅销毁连接(销毁的预期行为)
has_many :users, through: :user_workspaces,
inverse_of: :workspaces,
dependent: :destroy
然后 user.rb 保留 delete_workspaces 函数,但添加 dependent::destroy,以破坏关联。
user.rb
before_destroy: :delete_workspaces
has_many :workspaces, through: :user_workspaces,
dependent: :destroy
def delete_workspaces
self.workspaces.each(&:destroy)
end
现在两个测试都通过了。