2011-05-31 83 views
2

使用rails 3/3.1我想存儲發票和它們的項目(以及更多的關聯,比如付款等)。rails和命名空間模型問題

所以在第一種方法我設置了這樣的模式:

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而不是項目,因爲我已經有一個型號命名項目和我不知何故想要命名空間模型發票。但是這個名字有一個巨大的缺點,那就是必須使用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 

現在ASSOCATION是很好的命名,也該網址助手看起來很漂亮。但我無法再使用動態URL(例如[:new,invoice,:item]),因爲控制器設置爲「invoice_item」而不是「invoice/item」。

我想知道別人怎麼解決這個問題,我做錯了什麼。或者這只是一個錯誤在軌道3.0.7/3.1.rc?編號: 對不起,我似乎沒有正確表達我的關注。我的模型項目與發票::項目無關。 Order :: Item也與Item和Invoice :: Item無關。發票::項目只能屬於一張發票。訂單::項目只能屬於訂單。我需要命名空間 - 但爲什麼rails沒有正確支持開箱即用的命名空間?或者我在做什麼錯誤的命名空間?

科林

+0

只是想知道爲什麼你想命名空間項目模型? – Ant 2011-05-31 15:15:00

+0

因爲我有另一個名爲Item的模型。項目是一個真正的通用名稱,可以在很多情況下使用:發票::項目,訂單::項目,... – gucki 2011-05-31 15:19:09

+0

爲什麼不會有發票'has_many:items'?對我來說,如果我要購買物品,那我的發票上就會出現這種情況。另外,你的物品不屬於許多發票?當然,你不會有一個單一的發票。你可能會看到一個HABTM關係。 – 2011-05-31 15:20:06

回答

0

如果訂單項和發票項目是不是在現實世界相同的對象,那麼我會爲它們命名不同,而不是試圖命名空間,例如OrderItemInvoiceItem - 這將讓事情更清晰的您的代碼庫會不斷增加,並避免在引用項目的任何地方確保使用正確的名稱空間。

+0

這是我採用的第一種方法(如上所述)。但它會在幾個廣告牌中導致糟糕的名字,比如關聯,路線,路徑助手等。所以這不是一個實用的解決方案。 – gucki 2011-06-03 18:36:54

+0

確實如此,但在顯示給用戶之前,您可以隨時整理這些內容。 – Ant 2011-06-05 14:20:49