修改继承的Rails关联

时间:2010-06-15 22:23:55

标签: ruby-on-rails ruby

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

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

是否有某种方法可以修改Team中的继承关联,这样我就不必重新定义整个内容,而只需添加:after_add钩子呢?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分: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)来绕过可见性约束。但我不明白为什么你应该这样做。

答案 1 :(得分:0)

我能看到的最清楚的方法是将add_company_membership类中的Group定义为空方法,然后在Team中覆盖它以实际执行您想要的操作。然后,您将:after_add保留在Group上,然后从那里开始。

不幸的是,它不像在组类中忽略任何想法:after_add那样干净,这是理想的。

答案 2 :(得分:0)

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