使用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的模型,并且我想以某种方式将该模型命名为invoices。但这个名称有一个巨大的缺点,那就是必须使用invoice.invoice_items,而不是直观的invoice.items。此外,生成的url助手看起来非常难看,例如"new_invoice_invoice_iitem_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
路线是这样的:
resources :invoices do
resources :items, :module => "invoice"
end
现在,关联的名称很好,url助手也很漂亮。但是我不能再使用动态url(例如[:new,invoice,:item]),因为控制器被设置为"invoice_item"而不是"invoise/item"。
我想知道别人是怎么解决这个问题的,我做错了什么。或者这只是rails 3.0.7/3.1.rc中的一个错误?
编辑:对不起,我似乎没有正确表达我的担忧。我的模型项目与发票::项目无关。订单::物料也与物料或发票::物料无关。发票::物料只能属于一张发票。订单::项目只能属于订单。我需要命名空间,但为什么rails不能正确地支持开箱即用的命名空间?或者我在命名方面做错了什么?
Corin
如果订单项目和发票项目在现实世界中不是同一个对象,那么我会以不同的名称命名它们,而不是尝试命名名称空间,例如OrderItem
和InvoiceItem
-这将随着代码库的增长而使事情变得更清晰,并避免需要确保在引用项目时使用正确的名称空间。