rails和namespaced models问题

时间:2011-05-31 15:07:58

标签: ruby-on-rails-3 namespaces models

使用rails 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)”(请注意double invoice_invoice)。

所以我改成了这样的命名空间模型:

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

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

路线喜欢这个:

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

现在,关联名称很好,并且网址助手看起来很漂亮。但我不能再使用动态网址(例如[: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。我需要命名空间 - 但为什么rails不能正确支持命名空间开箱即用?或者我对命名空间做错了什么?

科林

1 个答案:

答案 0 :(得分:0)

如果订单商品和发票商品在现实世界中不是同一个对象,那么我会以不同的方式命名它们,而不是尝试命名空间,例如OrderItemInvoiceItem - 这将保留一些东西随着代码库的增长更加清晰,并且无需确保在引用项目的任何地方使用正确的命名空间。