проблема рельсов и пространственных моделей - PullRequest
2 голосов
/ 31 мая 2011

Использование рельсов 3 / 3.1 Я хочу хранить накладные с их товарами (а затем и другими ассоциациями, такими как платежи и т. Д.).

Итак, при первом подходе я настроил модели следующим образом:

class Invoice < ActiveRecord::Base
  has_many :invoice_items
end

class InvoiceItem < ActiveRecord::Base
  belongs_to :invoice
end

И маршрутам это нравится:

resources :invoices do
  resources :invoice_items
end

Я выбрал InvoiceItem вместо Item, потому что у меня уже есть модель с именем Item, и я каким-то образом хочу указать пространство модели для счетов-фактур.Но у этого имени есть огромный недостаток: нужно использовать invoice.invoice_items вместо интуитивного invoice.items.Также сгенерированные помощники URL выглядят очень уродливо, например, «new_invoice_invoice_item_path (invoice)» (обратите внимание на двойной invoice_invoice).

Поэтому я перешел на модели с пространством имен, такие как:

class Invoice < ActiveRecord::Base
  has_many :items, :class_name => "Invoice::Item"
end

class Invoice::Item < ActiveRecord::Base
  belongs_to :invoice
end

ИRoutes вот так:

resources :invoices do
  resources :items, :module => "invoice"
end

Теперь ассоциация названа красиво, а также помощники URL выглядят красиво.Но я больше не могу использовать динамические URL-адреса (например, [: new, invoice,: item]), потому что для контроллера установлено «invoice_item» вместо «invoice / item».

Интересно, как другиелюди решают эту проблему и что я делаю не так.Или это просто ошибка в rails 3.0.7 / 3.1.rc?

РЕДАКТИРОВАТЬ: Извините, кажется, я не правильно выразил свою озабоченность.Моя модель Item не связана с Invoice :: Item.Order :: Item также не имеет отношения к Item или Invoice :: Item.Invoice :: Item может принадлежать только одному счету.Order :: Item может принадлежать только Order.Мне нужно пространство имен - но почему рельсы должным образом не поддерживают пространство имен из коробки?Или что я делаю не так с пространством имен?

Корин

1 Ответ

0 голосов
/ 03 июня 2011

Если элемент заказа и элемент счета-фактуры не являются одним и тем же объектом в реальном мире, то я бы назвал их по-другому, а не пытался бы использовать пространство имен, например, OrderItem и InvoiceItem - это сделает вещи более понятными, чем ваша кодовая база растет и избегает необходимости убедиться, что вы используете правильное пространство имен везде, где вы ссылаетесь на Item.

...