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,:通过
连接用户和项目?刚刚添加了它们。我认为他们不是最好的,他们可以改进。欢迎您提出任何建议:)