Сделать все модели Rails наследуемыми от определенного класса - PullRequest
0 голосов
/ 20 января 2011

Я написал метод upsert для одной из моих моделей. Я хотел бы, чтобы все мои модели имели этот метод upsert. Мне казалось, что логичным решением было определить модель, которая наследуется от ActiveRecord::Base, а затем наследовать от нее все мои другие модели. Но если я это сделаю, Rails будет жаловаться, что у новой модели, которую я создал, нет таблицы, которая бы соответствовала действительности, но это мне безразлично.

Поскольку то, что я попробовал, по-видимому, неправильный способ сделать это, какой правильный способ сделать это?

Ответы [ 3 ]

7 голосов
/ 20 января 2011

Вы можете расширить ActiveRecord с помощью модуля.Вы делаете это только в одном месте, и оно будет доступно для всех моделей, которые наследуются от ActiveRecord.

3 голосов
/ 20 января 2011

Есть два способа сделать это.

1) Чтобы иметь родительскую модель, но не нужно создавать для нее таблицу (то есть абстрактный класс), вы должны установить

class YourAbstractClass < ActiveRecord::Base
    self.abstract_class = true 

    # rest of class code
end

2) Поместите метод в модуль , который вы включаете из всех своих моделей, которые в нем нуждаются (как в ответе @ Mark)

0 голосов
/ 20 января 2011

Вы можете переместить этот метод в модуль и включить этот модуль во все модели, которым требуется этот метод.

Как будто у меня есть этот модуль Utils в папке lib моего приложения модуль Utils ...

  def to_name(ref)
      ref.gsub('_', ' ').split.collect { |w| w.capitalize }.join(' ')
  end

  ...
end

Тогда в моей модели я говорю

class MyModel < AR::Base
  include Utils
  ...
end

Возможно, если вы используете Rails 3, вам следует загрузить файлы в папку lib, настроив ваше приложение

config.autoload_paths += %W(#{config.root}/lib)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...