Модель с использованием модулей в приложении Rails - PullRequest
13 голосов
/ 23 сентября 2010

У меня есть модель, которая требует загрузки внешних данных из вспомогательного источника. Существует ряд веб-сервисов, из которых моя модель может извлекать данные (заменяемые), но я не хочу создавать код, который затруднит изменение сервисов (затраты значительно различаются в зависимости от переменного и фиксированного использования и, вероятно, меняются потребуется).

Я хотел бы создать драйвер для взаимодействия (а затем создать дополнительные пользовательские драйверы, если служба требует переключения). К сожалению, из-за тесной связи драйвера и модели не имеет смысла извлекать код в плагин или гем. Я извлек весь код в модуль (см. Пример), и в настоящее время код, объявленный выше моей модели.

module Synchronize
  def refresh
    self.attributes = ...
    self.save
  end
end

class Data < ActiveRecord::Base
  include Synchronize
end

Есть ли в Rails (3.0.0) соглашение о хранении модулей, тесно связанных с моделями? Должен ли я использовать плагин для этого? Связано ли это с каталогом app / helpers? Если нет, где находится наиболее подходящее место для хранения кода? Спасибо!

Ответы [ 2 ]

27 голосов
/ 28 сентября 2010

Вы правы, что если модуль тесно связан с этой конкретной моделью, то он не является хорошим кандидатом для гема / плагина.

app / helpers / предназначен для вспомогательных методов представления и не должен содержать модулейкоторые предназначены исключительно для микширования в модели.

Одно место, куда вы можете поместить модуль, находится в lib /.Это для кода, который на самом деле не подходит нигде в приложении / и часто является исходным домом слабосвязанного кода перед его перемещением в плагин (но это не жесткое и быстрое правило).Однако, поскольку ваш модуль тесно связан с вашей моделью, lib / может быть не лучшим местом для него.

Я знаю, что 37 сигналов (и других) используют концепцию «проблем» как способ сохранения взаимосвязиКод модели организован в виде модулей.Это реализуется путем создания приложения / задач / и размещения модулей там.Затем этот каталог добавляется в путь загрузки приложения в config / application.rb (config / environment.rb для Rails 2) с помощью:

config.load_paths += %W(#{Rails.root}/app/concerns)

Затем модуль можно смешать с моделью как обычно.

Вот оригинальное сообщение в блоге об этом от Jamis Buck - http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

Другой вариант этого, который я лично предпочитаю, хотя он не включает модули, использует этот плагин: http://github.com/jakehow/concerned_with

Надеюсь, это поможет.

2 голосов
/ 04 ноября 2011

Эта ссылка помогла мне в этом.

http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

Я поместил его в каталог model / extensions. Каталог проблем имеет смысл, но слово «проблемы» не кажется мне очевидным. Может быть, это будет расти на мне.

Я также добавил путь к расширениям в application.rb

config.autoload_paths += %W(#{config.root}/app/models/extensions)
...