Я не вижу каких-либо технических проблем для любого подхода. Проблема, с которой я столкнулся, заключается в том, что когда класс встроен в его родительский объект и также находится в том же файле, я забуду, что он там есть. Поэтому, если ваше пространство имен называется Order::LineItem
, вы можете создать папку «order» в папке «models» и поместить туда «line_item.rb».
Другая проблема в том, что если вы хотите иметь контроллер для Order::LineItem
, вы также должны указать пространство имен и поместить его в папку, и в маршрутизаторе он будет выглядеть так:
resource :orders do
resources :line_items, :controller => "order/line_items"
end
Если вы не знаете , что ваше приложение будет иметь несколько типов line_items, я бы не рекомендовал использовать пространство имен - вы могли бы перезаписать код, если бы сделали это. Например, если позже вам понадобятся два типа line_items, вы можете даже обнаружить, что часть вашего кода может быть повторно использована между моделями, и если вы поместите пространство имен в свой первый line_item, вы можете оказаться де-пространством между ними.
В Python пространства имен считаются отличной вещью, которой должно быть больше. Но когда вы думаете о глобальном пространстве имен вашего Rails-приложения, оно не так загромождено. Авторы драгоценных камней довольно хорошо хранят пространство имен всех своих классов в одном модуле гемов, поэтому в вашем приложении на Rails у вас будет по одному пространству имен для каждого используемого вами гема (сам Rails - 5 гемов, не уверен, сколько глобальных константы, хотя), плюс и куча файлов, включенных в Rails (например, SecureRandom). Оказывается, очень приятно иметь эти файлы «просто там», и на практике я обнаружил, что коллизии пространства имен редки, и вы легко можете их обойти. Возможно, я столкнулся с проблемой пространства имен только один раз, но несколько раз я случайно определял метод «отправки» в модели - гораздо более распространенная проблема с подобными последствиями.