Этот вопрос относится к использованию Ruby on Rails 3 с MongoMapper и EmbeddedDocument. Кроме того, ManyAssociation.
http://mongomapper.com/documentation/embedded-document.html
Примеры MongoMapper (по ссылке выше) показывают два отдельных класса:
class Order
include MongoMapper::Document
many :line_items
timestamps!
end
class LineItem
include MongoMapper::EmbeddedDocument
key :name, String
key :quantity, Integer
end
Но это загрязняет глобальное пространство имен LineItem. Вне контекста, LineItem для чего? А что, если я хочу, чтобы другая модель, например WishList, также имела набор LineItem?
Таким образом, можно встроить класс LineItem внутрь Order следующим образом:
class Order
include MongoMapper::Document
many :line_items, :class_name => "Order::LineItem"
timestamps!
class LineItem
include MongoMapper::EmbeddedDocument
key :name, String
key :quantity, Integer
end
end
Хотя технически это может быть нормально (да?), не столкнусь ли я позже с проблемами дизайна? Это просто делает код слишком уродливым? Слишком сложно?
Предположительно, наличие this в языке Ruby означает, что кто-то считает это хорошей идеей?
Что мне всегда нравилось в Django, так это то, как он использует «приложения» для группировки связанных классов моделей (и разделения пространств имен). Таким образом, мой код выше также достигает этого в Rails.