2012-05-07 52 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