DonutWorks / Ari

0 stars 0 forks source link

연관관계에 dependent: :destroy 걸기 #323

Open shaynekang opened 9 years ago

shaynekang commented 9 years ago

레일즈 모델의 has_many에는 dependent: :destroy 라는 개념이 있습니다. 부모 모델이 DB에서 제거되었을 경우, 자식 모델도 함께 DB에서 없애주는 기능이죠.

가령 사용자와 초대장 모델의 연관관계를 다음과 같이 정의했다면,

class User < ActiveRecord::Base
  has_many :invitations
end

class Invitation < ActiveRecord::Base
  belongs_to :user
end

사용자를 DB에서 제거하면 초대장이 남아있게 됩니다. 이를 방지하기 위해서는 다음의 코드를 추가해야겠죠.

class User < ActiveRecord::Base
  has_many :invitations, dependent: :destroy
end

class Invitation < ActiveRecord::Base
  belongs_to :user
end

모델 연관관계를 살펴보고 dependent: :destroy가 필요한 부분은 추가해 주면 좋겠습니다. ㅎㅎ

minhyeok4dev commented 9 years ago

제가 구현하던 것도 같은 고민이 있었는데 그냥 저희끼리 있을때 간단히 얘기하기로는 "관계를 끊어 남겨버리는 한이 있더라도 소중한(?) DB를 날리진 말자"로 정했었는데요. 다시 정책을 세워볼 필요가 있을까요?

shaynekang commented 9 years ago

그런 경우에는 destroy할 때 flag를 세우는 방식을 사용하는 걸 권장합니다. ㅎㅎ

User는 없는데 Invitation만 남아있는 경우가 생긴다면 곤란할 것 같습니다. invitations.user_id가 nil인게 버그로 생긴 잘못된 데이터인지, User가 삭제된 데이터인지 알 수 없으니까요.

User를 지울거면 둘 다 지우고, 안 지울거면 둘 다 안 지우되 flag를 세워주는 게 좋을 것 같아요. ㅎㅎ