首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据其他资源删除资源

根据其他资源删除资源
EN

Stack Overflow用户
提问于 2012-05-07 21:28:26
回答 2查看 38关注 0票数 0

--我有用户和项目资源,以及连接他们的连接表,称为project_members。当所有用户离开项目时,项目都会自毁,比如下面的规范:

代码语言:javascript
复制
 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

到目前为止,我想出了这句话,但不知道该放在哪里.

代码语言:javascript
复制
@project.destroy if @project.users.empty?

编辑:这是我的模特

用户模型(我正在使用设计)

代码语言:javascript
复制
  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

项目模型

代码语言:javascript
复制
  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

突触模型(项目成员)

代码语言:javascript
复制
  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

任务模型

代码语言:javascript
复制
  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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-07 21:48:46

成员资格模型的回调应该做到这一点:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-05-07 22:10:50

首先,您的关系语句可以简化:

代码语言:javascript
复制
belongs_to  :user,
  :class_name => 'User',          
  :foreign_key => 'user_id'

会变得很简单

代码语言:javascript
复制
belongs_to  :user

:class_name:foreign_key属性是默认的,因为您已经拥有了它们。

如果最后一个用户离开了该项目,您应该在Synapses类上添加一个回调,以破坏它。就像这样:

代码语言:javascript
复制
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回调--如果那个已经很好的话,就没有意义编造一些东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10489409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档