我定义了以下类/关系:
class Component < ActiveRecord::Base
has_many :component_stories,:dependent => :destroy
has_many :stories, :through => :component_stories
end
class Story < ActiveRecord:Base
has_many :component_stories,:dependent => :destroy
has_many :components, :through => :component_stories
end
class ComponentStory < ActiveRecord::Base
belongs_to :component
belongs_to :story
end
假设我们有一个包含2个故事的component1:story1和story2。 story2也属于component2。如果我们删除component1,则将永久删除story1,但story2仍然属于component2。我在Component模型中定义了一个方法来删除与任何其他组件无关的故事:
def delete_dependent_stories
stories.each do |story|
if story.component_stories.size == 1
story.destroy
end
end
end
将在components_controller的destroy动作中调用此方法:
def destroy
component = Component.find(params[:id])
component.delete_dependent_stories
component.destroy
...
end
这样,我确保没有与任何组件无关的“僵尸”故事。我担心的是,是否有更好的方法可以替代组件模型中的方法。
答案 0 :(得分:0)
你应该利用这样的模型回调:
class Component < ActiveRecord::Base
has_many :component_stories,:dependent => :destroy
has_many :stories, :through => :component_stories
after_destroy :delete_dependent_story?
private
def delete_dependent_stories
stories.each do |story|
if story.has_component_stories?
story.destroy
end
end
end
class Story < ActiveRecord:Base
has_many :component_stories,:dependent => :destroy
has_many :components, :through => :component_stories
self.has_component_story?
component_stories.size == 1
end
end
请勿使用before_destroy
,因为无论删除story
是否成功,都会删除component
。