Я немного читал о том, как расширить ActiveRecord: базовый класс, чтобы в моих моделях были специальные методы. Каков простой способ его расширения (пошаговое руководство)?
ruby-on-rails
extend
rails-activerecord
xpepermint
источник
источник
Ответы:
Есть несколько подходов:
Использование ActiveSupport :: Concern (предпочтительно)
Прочитайте документацию ActiveSupport :: Concern для более подробной информации.
Создайте файл с именем
active_record_extension.rb
вlib
каталоге.Создайте файл в
config/initializers
каталоге с именемextensions.rb
и добавьте в него следующую строку:Наследование (предпочтительное)
Обратитесь к ответу Тоби .
Исправление обезьян (следует избегать)
Создайте файл в
config/initializers
каталоге с именемactive_record_monkey_patch.rb
.Знаменитая цитата о регулярных выражениях Джейми Завински может быть переосмыслена, чтобы проиллюстрировать проблемы, связанные с исправлением обезьян.
Исправление обезьян легко и быстро. Но сэкономленные время и усилия всегда извлекаются в будущем; с сложным интересом. В эти дни я ограничиваю исправление обезьян, чтобы быстро создать прототип решения в консоли rails.
источник
require
файл в концеenvironment.rb
. Я добавил этот дополнительный шаг в мой ответ.ImprovedActiveRecord
и наследовать от него, когда вы используетеmodule
, вы обновляете определение рассматриваемого класса. Раньше я использовал наследование (причина многолетнего опыта работы с Java / C ++). В эти дни я в основном использую модули.Refinements
которая решает большинство проблем с исправлениями обезьян ( yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice ). Иногда есть особенность, чтобы заставить вас испытать судьбу. И иногда ты делаешь.Вы можете просто расширить класс и просто использовать наследование.
источник
abstract_models
. Где я должен положить это?self.abstract_class = true
к своемуAbstractModel
. Rails теперь распознает модель как абстрактную модель.AbstractModel
в базе данных. Кто знал, что простой сеттер поможет мне высушить вещи! (Я начинал съеживаться ... это было плохо). Спасибо Тоби и Хариш!Вы также можете использовать
ActiveSupport::Concern
ядро Rails, например:[Изменить] после комментария от @daniel
Тогда все ваши модели будут иметь метод,
foo
включенный как метод экземпляра, а методы -ClassMethods
как методы класса. Например, уFooBar < ActiveRecord::Base
вас будет:FooBar.bar
иFooBar#foo
http://api.rubyonrails.org/classes/ActiveSupport/Concern.html
источник
InstanceMethods
не рекомендуется с Rails 3.2, просто поместите ваши методы в тело модуля.ActiveRecord::Base.send(:include, MyExtension)
в инициализатор, и тогда это сработало для меня. Рельсы 4.1.9В Rails 4 концепция использования проблем для модульности и сушки ваших моделей была в центре внимания.
Проблемы, в основном, позволяют группировать сходный код модели или нескольких моделей в одном модуле, а затем использовать этот модуль в моделях. Вот пример:
Рассмотрим модель Article, модель Event и модель Comment. Статья или событие имеет много комментариев. Комментарий относится либо к статье, либо к событию.
Традиционно модели могут выглядеть так:
Модель комментария:
Модель статьи:
Модель события
Как мы можем заметить, существует значительный фрагмент кода, общий для Event и Article Model. Используя проблемы, мы можем извлечь этот общий код в отдельный модуль Commentable.
Для этого создайте файл commentable.rb в приложении / модель / концерны.
И теперь ваши модели выглядят так:
Модель комментария:
Модель статьи:
Модель события
Одна вещь, которую я хотел бы подчеркнуть при использовании проблем, заключается в том, что проблемы следует использовать для групповой, а не для технической группировки. Например, группировка доменов похожа на «Commentable», «Taggable» и т. Д. Группировка, основанная на технических аспектах, будет выглядеть как «FinderMethods», «ValidationMethods».
Вот ссылка на пост, который я нашел очень полезным для понимания проблем в моделях.
Надеюсь, рецензия поможет :)
источник
Шаг 1
Шаг 2
Шаг 3
источник
Направляющие 5 обеспечивают встроенный механизм выдвижения
ActiveRecord::Base
.Это достигается путем предоставления дополнительного слоя:
и все модели наследуются от этого:
Смотрите, например, этот блог .
источник
Просто чтобы добавить к этой теме, я потратил некоторое время на разработку, как протестировать такие расширения (я пошел по
ActiveSupport::Concern
пути.)Вот как я настроил модель для тестирования моих расширений.
источник
В Rails 5 все модели наследуются от ApplicationRecord, и это дает хороший способ включить или расширить другие библиотеки расширений.
Предположим, что модуль специальных методов должен быть доступен во всех моделях, включите его в файл application_record.rb. Если мы хотим применить это для определенного набора моделей, включите его в соответствующие классы моделей.
Если вы хотите, чтобы методы определялись в модуле как методы класса, расширьте модуль до ApplicationRecord.
Надеюсь, это поможет другим!
источник
у меня есть
в инициализаторе
Для модуля, как показано ниже
источник