我有用户和项目资源以及连接它们的连接表名为project_members。我希望在所有用户离开项目时都有功能,项目会自行销毁,如下所示:
75 it 'deletes the project when there are no more users on it' do
76 lambda do
77 project.users.clear
78 end.should change(Project, :count).by(-1)
79 end
到目前为止,我想出了这条线,但不知道该把它放在哪里......
@project.destroy if @project.users.empty?
编辑:这是我的模特
用户模型(我正在使用Devise)
1 class User < ActiveRecord::Base
2
3 has_many :synapses #aka project_members
4 has_many :projects, :through => :synapses
5
6 # Include default devise modules. Others available are:
7 # :token_authenticatable, :encryptable, :lockable, :timeoutable and :omniauthable
8 devise :database_authenticatable, :registerable,
9 :recoverable, :rememberable, :trackable, :validatable,
10 :confirmable
11
12 # Setup accessible (or protected) attributes for your model
13 attr_accessible :email, :password, :password_confirmation, :remember_me
14 end
项目模型
1 class Project < ActiveRecord::Base
2
3 has_many :synapses
4 has_many :users, :through => :synapses, :dependent => :nullify
5 has_many :tasks, :dependent => :destroy
6
7 #use this when you don't have callbacks
8 #has_many :tasks, :dependent => :delete_all
9
10 validates :name, :presence => true,
11 :uniqueness => true
12 validates :description, :presence => true
13
14 attr_accessible :name, :description
15
16 end
Synapses model AKA(项目成员)
1 class Synapse < ActiveRecord::Base
2
3 belongs_to :user,
4 :class_name => 'User',
5 :foreign_key => 'user_id'
6 belongs_to :project,
7 :class_name => 'Project',
8 :foreign_key => 'project_id'
9
10 end
任务模型
1 class Task < ActiveRecord::Base
2
3 belongs_to :project
4 belongs_to :user
5
6 validates :name, :presence => true
7 validates :description, :presence => true,
8 :length => { :minimum => 10 }
9
10 attr_accessible :name, :description
11
12 end
答案 0 :(得分:1)
会员模型的回调应该这样做:
class ProjectMember < ActiveRecord::Base
after_destroy :remove_project_if_last_member
private
def remove_project_if_last_member
project.destroy if project.users.empty?
end
end
答案 1 :(得分:1)
首先,您的关系陈述可以简化:
belongs_to :user,
:class_name => 'User',
:foreign_key => 'user_id'
可以简单地
belongs_to :user
无论如何,:class_name
和:foreign_key
属性都是默认属性。
如果最后一个用户离开,你应该在Synapses类上放置一个回调来销毁Project。像这样:
class Synapse < ActiveRecord::Base
after_destroy :remove_project_if_last_member
private
def remove_project_if_last_member
project.destroy if project.users.empty?
end
end
[注意:我从另一个答案复制了after_destroy回调 - 如果那个已经很好的话就没有意义。]