2010-06-15 68 views
3

我有一个继承自Group类的Team类。团队和团队都通过同一个协会拥有会员资格。但是,我需要在添加团队成员资格后运行方法,但不能添加组。目前,我有这样的事情:修改继承的Rails关联

class Group < ActiveRecord::Base 
    has_many :memberships, 
      :class_name => 'Connection', 
      :foreign_key => 'connectable_id', 
      :as => :connectable, 
      :dependent => :destroy 
end 

class Team < Group 
    has_many :memberships, 
      :class_name => 'Connection', 
      :foreign_key => 'connectable_id', 
      :as => :connectable, 
      :dependent => :destroy, 
      :after_add => :membership_check 

private 
    def membership_check(membership) 
    end 
end 

是否有某种方式来修改团队继承的关联,这样我就不必重新定义了整个事情,而是只需添加:after_add挂钩呢?

任何帮助,将不胜感激。

回答

0

我可以看到的最清晰的方法是将Group类中的add_company_membership定义为空方法,然后在Team中将其覆盖,以便在其中实际执行所需操作。然后,您将:after_add保留在Group上并从那里开始。

不幸的是,它并不像只能忽略任何想法:group类中的after_add,这将是理想的。

0

您是否尝试过仅在子类Team中添加:after_add挂钩?它不会在Group中被调用,因为它是超类,对吧?

1

试试这个,让我知道它是否有效。我应该这样想。确保你的membership_check方法不再是私人的。

class Group < ActiveRecord::Base 
    has_many :memberships, 
      :class_name => 'Connection', 
      :foreign_key => 'connectable_id', 
      :as => :connectable, 
      :dependent => :destroy, 
      :after_add => proc {|gr, dev| gr.membership_check(dev) if gr.respond_to? :membership_check} 
end 

class Team < Group 
    def membership_check(membership) 
    end 
end 

P.S.我不确定你需要传递给membership_check的参数,但是添加的开发者看起来很聪明。

P.P.S如果你想保持membership_check私密,你可以使用gr.send(:membership_check,dev)绕过可见性约束。但我不明白你为什么应该这样做。