2011-07-01 58 views
0

我有一個項目跟蹤系統,它有一個與發票有一對多關係的項目模型。這意味着一張發票可以有多個項目,一個項目可以屬於一張發票。在rails中存儲過去的關係

我現在已經遇到需要將庫存返回給我的系統,這意味着將交付的布爾型字段設置爲false,但除非將invoice_id設置爲零,否則它仍會顯示爲等待交付給客戶如果我沒有它,那麼我的系統將沒有任何記錄爲這個項目開發一個客戶。

我能看到這個工作良好的唯一方法就是擁有一個存儲發票ID的previous_invoices字段。這樣做可以從Item的角度來看Item.previous_invoices是有意義的,但它不會顯示在Invoice.items中,並且獲得已返回的項目,我需要使用LIKE條件執行db搜索。

我寧願不使用多對多關聯,因爲它只會是返回需要使用表的項目的一小部分。

有沒有辦法在軌道上做這件事,或者有可以處理任何一方發現的寶石?

回答

1

發票和項目之間的關係是多對多的,而您只是通過避免實現它而造成自己的困難。最乾淨的解決方案是InvoiceItems表,其中包含一些類似'返回'字段的表格,您可以在您拉取發票項目時檢查該項目,可能會在發票的HABTM與項目的關聯中使用條件。

+0

我在想這就是我必須要這樣做,只是要改變關係的痛苦。我有幾個月需要更換的物品。我猜最好的方法是創建新表,然後編寫一個腳本來創建正確的記錄,並使用invoice_id字段作爲參考 – Arcath

+0

@Arcath,我們在一個大項目中有很多代碼因爲在應用程序之間共享的數據庫重構模式非常困難。這很糟糕,結構性技術債務難以償還。如果您仍然可以重構架構,那最好。 – Mori

+0

我在考慮一個耙子任務應該能夠把它整理出來,所以如果我修改所有的代碼來支持許多我當前的數據應該使它看起來像沒有發票有項目,然後當我運行耙子任務時它可以在InvoiceItems表中創建記錄並使用新功能還原相同的數據 – Arcath