2010-06-15 48 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)繞過可見性約束。但我不明白你爲什麼應該這樣做。