Это субъективный ответ, поэтому, вероятно, в какой-то момент он будет закрыт.
Поскольку я дал ответ на исходный вопрос, позвольте мне попытаться ответить на этот.
Есть два возможных места, где вы можете хранить этот файл:
В этом конкретном случае я бы выбрал папку lib
. Для каждого приложения Rails, над которым я работаю, у меня обычно есть определенная папка в lib, называемая тем же именем проекта, которое представляет собой пространство имен, в котором я храню бизнес-логику, специфичную для моего приложения.
Например, если мой проект называется whatever
, у меня есть lib/whatever
вместе с файлом lib/whatever.rb
, который является корнем моего пространства имен.
module Whatever
end
Каждый файл в папке lib/whatever
вложен в это пространство имен. В этом случае вы можете создать папку для ваших комиссионных стратегий по адресу lib/whatever/commissions
и создать следующие файлы
# lib/whatever/commissions/alpha_strategy.rb
class Whatever::Commissions::AlphaStrategy
end
# lib/whatever/commissions/beta_strategy.rb
class Whatever::Commissions::BetaStrategy
end
Чтобы уменьшить количество файлов, вы можете просто иметь файл lib/whatever/commissions.rb
, в котором будут храниться все стратегии. Это хорошо работает, когда реализация каждой стратегии относительно короткая.
# lib/whatever/commissions.rb
module Whatever::Commissions
class AlphaStrategy
end
class BetaStrategy
end
end
Вместо этого давайте посмотрим, почему я не поместил бы эти файлы в app
. Опять же, этот ответ субъективен и основан на моем личном опыте работы с довольно большими и сложными приложениями Rails.
Я видел использование /app
для хранения большого количества вещей. Например, распространенным шаблоном является создание папки app/workers
в приложении. Что может иметь смысл, так как воркеры являются глобальными (тем не менее, вы можете хранить их в lib
). В вашем случае то, что вы создаете, действительно ориентировано на одну модель, поэтому иметь специальную папку в /app
, вероятно, слишком много. Кроме того, если вы используете общее имя, такое как strategies
, оно вообще не будет иметь смысла.
Так почему бы не app/models
тогда? Ну, на самом деле это может быть второй вариант. Однако я предпочитаю хранить только модели в этой папке, а модели для меня означают только функции, связанные с сохранением.
То, что вы создаете, не имеет прямого отношения к настойчивости. Он использует сохраняемый объект (экземпляр модели), но не имеет ничего общего с сохранением данных в базе данных. Поэтому в app/models
смысла нет.
В небольшом проекте вы, вероятно, можете сохранить его в app/models
, но я работал с проектами, в которых у вас есть более 30 моделей, и если вы сохраните все эти функции, не связанные с сохранением, в app/models
, ваша папка постепенно станет беспорядком.
person
Simone Carletti
schedule
06.12.2015