2012-05-07 3 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? 

편집 : 여기 내 모델

사용자 모델 (내가 사용 고안)

은 33,210

프로젝트 모델

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

당신이 방법에 대한 설명을 추가시겠습니까 3 개의 모델이 모두 함께 작동합니까? 사용자와 프로젝트를 연결하기 위해'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? 나는 사용자를 파괴하고 싶지 않고 단지 사용자와 프로젝트 사이의 링크를 파괴하고 싶다 ... 링크가 없으면 프로젝트는 파괴되어야한다. 하지만 이것이 올바른 방향이라고 생각합니다. 아마도 프로젝트 모델의 콜백 이전에 있을까요? – 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 속성의 기본이 될 수 있습니다 어쨌든 그들.

마지막 사용자가 Project를 종료하면 프로젝트를 파괴하기 위해 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

관련 문제