Изменение унаследованной ассоциации Rails - PullRequest
3 голосов
/ 16 июня 2010

У меня есть класс 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 ]

1 голос
/ 20 июня 2010

Попробуйте и дайте мне знать, если это работает. Это я должен думать. Убедитесь, что ваш 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. Я не уверен, что вам нужно было передать в аргумент members_check, но добавленный разработчик, похоже, имеет смысл.

P.P.S Если вы хотите сохранить membership_check в секрете, вы можете использовать gr.send (: members_check, dev), чтобы обойти ограничение видимости. Но я не понимаю, почему ты должен.

0 голосов
/ 16 июня 2010

Вы пытались просто добавить хук :after_add только в команду подкласса?Он не будет вызываться в группе, так как это суперкласс, верно?

0 голосов
/ 16 июня 2010

Самый ясный способ, который я вижу, это определить add_company_membership в классе Group как пустой метод, а затем переопределить его в Team, чтобы фактически сделать то, что вы хотите там. Затем вы сохраняете :after_add в группе и идете оттуда.

К сожалению, это не так просто, как просто игнорировать любую идею: after_add в классе Group, что было бы идеально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...