Повторное открытие класса, который включает Mongoid :: Document - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть простой класс:

class User
  include Mongoid::Document
  field :name
end

И я хотел бы снова открыть его, чтобы добавить обратный вызов Mongoid:

class User
  before_create :do_this
  def do_this
    # do it...
  end
end

К сожалению, я получил ошибку: undefined method 'before_create' for User:Class

Есть идеи, как это сделать? Стоит ли использовать миксин-паттерн вместо повторного открытия?

ОБНОВЛЕНИЕ : Я не могу изменить исходное определение класса, так как оно находится в общей библиотеке. И порядок загрузки сложен, потому что он в Rails. Исходный класс находится в файле, загруженном в autoload_path. Где я должен открыть это? И я предпочел бы использовать модуль, а не открывать его, но я не уверен, что возможно включить мой модуль «извне»!

ОБНОВЛЕНИЕ 2 : Вы правы, это просто проблема порядка загрузки. Итак, теперь мой вопрос звучит так: Поскольку автозагрузка Rails ленива, как я могу заставить Rails загружать мой файл повторного открытия после загрузки исходного файла класса? :)

1 Ответ

1 голос
/ 28 февраля 2012

Ваш код выше работал для меня в консоли. Я подозреваю, что объявление второго класса загружается первым. Вы можете попытаться распечатать сообщение непосредственно внутри каждого объявления класса, например

class User
  puts "First"
  ...
end

...

class User
  puts "Second"
  ...
end

и проверка того, что они загружаются в правильном порядке.

Кроме того, если у вас есть доступ к первому объявлению класса, вы можете использовать миксин, если это возможно, поскольку он хранит все для класса User в одном месте.

ОБНОВЛЕНИЕ : Можете ли вы сначала загрузить / потребовать общий класс User, чтобы убедиться, что он загружен? То есть:

require 'app/models/user'

class User
  before_create :do_something
  def do_something
    ...
  end
end
...