2012-05-07 63 views
0

我有用户和项目资源以及连接它们的连接表,名为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? 

编辑:这里是我的模型

用户模型(我使用的设计)

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 

突触模型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

能否请您添加的是怎么描述三个模型一起工作?您是否在使用'has_and_belongs_to_many'或'has_many,:through'连接用户和项目? –

+0

只是添加了他们。我认为他们不是最好的,他们可以改进。任何想到的提示都会受到欢迎:) – oFca

回答

1

对T的回调他会员制模式应该这样做:

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 
+0

after_destroy?我不想破坏用户,只是想破坏用户和项目之间的联系......当没有链接时,项目应该被销毁。但我认为这是正确的轨道,也许before_delete在项目模型中回调? – oFca

+0

@oFca在ProjectMember类上如何?回答编辑以反映。 – Unixmonkey

+0

也许...我的模型添加到问题中,所以你可以看到你到底在处理什么。也认为他们需要一点工作,所以如果你注意到任何建议,请告诉我:) – oFca

1

首先,你们的关系的语句可以简化为:

belongs_to :user, 
    :class_name => 'User',   
    :foreign_key => 'user_id' 

可以成为简单

belongs_to :user 

:class_name:foreign_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 

[注:我复制从另一个答案after_destroy回调 - 在做什么了,如果一个已经好没有意义]

+0

不工作。仍然说项目计数没有改变...? – oFca

相关问题