Ruby: Как вы запускаете что-то, только когда наследуется неабстрактным классом? - PullRequest
0 голосов
/ 07 июня 2011

У меня есть абстрактный Base класс.Давайте назовем его Animal::Base.

module Animal
  class Base < ActiveRecord::Base
    self.abstract_class = true # so that Rails won't think this is in STI-mode
    ordered_tree
  end
end

ordered_tree просто применяет гем OrderedTree к классу, который вызывает метод:

belongs_to :parent_node, :class_name => name, ... 

Получаетимя класса, к которому он применяется.Тем не менее, name на данный момент является Animal::Base, но я хочу, чтобы он был тем, что наследует класс Animal::Base:

class Dog < Animal::Base
end

В этом случае я хочу, чтобы parent_node ссылался на Dog класс (эффективно применяя belongs_to :parent_node, :class_name => "Dog", ...), а не Animal::Base.Это возможно?

1 Ответ

1 голос
/ 07 июня 2011

Возможно, вам придется поместить свой заказ order_tree в класс Dog.Существует также метод self.included, но он запускает все в пределах родительского класса, хотя и передает дочерний класс в качестве параметра.Итак, может быть, вы могли бы сделать что-то вроде:

module Animal
  class Base < ActiveRecord::Base
    self.abstract_class = true
    def self.inherited(chld)
      chld.send('ordered_tree')
    end
  end
end

Я сам не пробовал и подозреваю, что вы можете столкнуться с той же проблемой (order_tree все еще работает в контексте Base), но это стоит попробовать ...

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