Ruby on Rails:删除相关模型的更好方法

时间:2012-01-25 23:05:57

标签: ruby-on-rails ruby model relationship

我定义了以下类/关系:

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

这样,我确保没有与任何组件无关的“僵尸”故事。我担心的是,是否有更好的方法可以替代组件模型中的方法。

1 个答案:

答案 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