Ruby on rails 根据其他资源删除资源
我有用户和项目资源以及连接它们的联接表,称为项目成员。我希望在所有用户离开项目时,项目会自行销毁,类似于下面的规范:Ruby on rails 根据其他资源删除资源,ruby-on-rails,Ruby On Rails,我有用户和项目资源以及连接它们的联接表,称为项目成员。我希望在所有用户离开项目时,项目会自行销毁,类似于下面的规范: 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 到目
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?
编辑:这是我的模型
用户模型(我正在使用Desive)
1类用户:突触
5.
6#包括默认设计模块。其他可供选择的项目包括:
7#:令牌可认证、可加密、可锁定、可超时和可全授权
8设计:数据库可验证,可注册,
9:可恢复,:可记忆,:可跟踪,:可验证,
10:可证实
11
12#设置模型的可访问(或受保护)属性
13属性可访问:电子邮件、:密码、:密码确认、:记住我
14完
项目模型
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
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
1类项目:synapses,:依赖=>:nullify
5有许多:任务,:依赖=>:销毁
6.
7#在没有回调时使用此选项
8#有许多:任务,:依赖=>:全部删除
9
10验证:name,:presence=>true,
11:唯一性=>true
12验证:description,:presence=>true
13
14属性可访问:名称:描述
15
16端
突触模型AKA(项目成员)
1类SynapseUser,
5:外键=>'user\u id'
6属于:项目,
7:class_name=>“项目”,
8:外键=>'project\u id'
9
10端
任务模型
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
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
1类任务true
7验证:description,:presence=>true,
8:长度=>{:最小=>10}
9
10属性可访问:名称:描述
11
12结束
对成员资格模型的回调应该可以做到这一点:
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
class项目成员
首先,您的关系陈述可以简化:
belongs_to :user,
:class_name => 'User',
:foreign_key => 'user_id'
可以变得简单
belongs_to :user
:class\u name
和:foreign\u key
属性默认为您拥有的属性
如果最后一个用户离开了项目,您应该在Synapses类上放置一个回调来销毁该项目。大概是这样的:
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
classsynapse
[注意:我从另一个答案复制了销毁后的回调——如果这个答案已经很好,那么就没有必要编造任何东西。]销毁后?我不想破坏用户,只想破坏用户和项目之间的链接。。。当并没有链接时,项目应该被销毁。但我认为这是正确的,也许在项目模型中删除回调之前?@oFca在ProjectMember类中如何?答案经过编辑以反映。也许。。。将我的模型添加到问题中,以便您可以准确地看到您正在处理的内容。此外,我认为他们需要一些工作,所以如果你注意到任何建议,请告诉我:)它不起作用。仍然说项目数量没有改变。也许这是因为这个“项目”未定义并且返回nil?如果是这样,如何正确地分配它?@oFca我认为
project.synapses.destroy\u all
就可以了。你能补充一下这三个模型是如何协同工作的吗?您是否正在使用has\u和\u-belient\u-to\u-many
或has\u-many,:通过
连接用户和项目?刚刚添加了它们。我认为他们不是最好的,他们可以改进。欢迎您提出任何建议:)