Ruby: импорт двух модулей / классов с одинаковым именем - PullRequest
3 голосов
/ 16 ноября 2010

Когда моей системе требуются два класса или модуля с одним и тем же именем, что я могу сделать, чтобы указать, что я имею в виду?

Я использую рельсы (новые для него), и одна из моих моделей называется"Нить".Когда я пытаюсь сослаться на класс "Thread" в thread_controller.rb, система возвращает некоторую другую константу с тем же именем.

<thread.rb>
class Thread < ActiveRecord::Base

  def self.some_class_method
  end

end

<thread_controller.rb>
class ThreadController < ApplicationController

  def index
    require '../models/thread.rb'
    @threads = Thread.find :all
  end

end

Когда я пытаюсь Thread.find (), я получаю сообщение об ошибкеэтот поток не имеет метода с именем find.Когда я обращаюсь к Thread.methods, я не нахожу среди них мой метод some_class_method.

Любая помощь?(И не пишите «просто назовите вашу модель как-нибудь иначе». Бесполезно указывать на очевидные компромиссы.)

Ответы [ 3 ]

2 голосов
/ 18 ноября 2010

Если вам абсолютно необходимо перезаписать существующую константу, вы можете сделать что-то вроде этого:

# use Object to make sure Thread is overwritten globally
# use `send` because `remove_const` is a private method of Object
# Can use OldThread to access already existing Thread
OldThread = Object.send(:remove_const, :Thread)

# define whatever you want here
class MyNewThread 
  ...
end

# Now Thread is the same as MyNewThread
Object.send(:const_set, :Thread, MyNewThread)

Очевидно, что все, что зависело от ранее существовавшего Thread, было бы уничтожено, если вы не сделали какую-то обезьяну-patching.

То, что такого рода вещи можно сделать, не значит, что так и должно быть.Но в определенных обстоятельствах это может быть удобно, например, в тестах вы можете переопределить удаленный источник данных своим собственным «тупым» объектом.

2 голосов
/ 18 ноября 2010

Вы можете поместить свое приложение в собственное пространство имен.

<my_app/thread.rb>
module MyApp
  class Thread
  end
end
2 голосов
/ 16 ноября 2010

Нет, на самом деле, назовите вашу модель как-нибудь еще.

Thread является зарезервированной константой в Ruby, и переопределение этой константы только заставит вас столкнуться с проблемами. Я пошел на компромисс для моего приложения и назвал его Topic.

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