2015-06-04 80 views
0

我正在製作一個應用程序,讓人們列出他們想要出售的食品。他們列出菜餚(菜餚模型),當人們購買時,會創建一個訂單記錄。評論模式 - 在兩個不同的其他模型共享

我希望人們能夠在菜餚上提交評論,如果他們購買了它,並且還檢查命令(該命令涉及會見該人)。

我在想,如果我如下可以創建一個審查模式:

class Review < ActiveRecord::Base 
    belongs_to :dish 
    belongs_to :order 
end 

我覺得這是不對的。對菜餚的評論以及對訂單的評論將會有不同的領域,並且可能會有完全不同的邏輯,但是在同一時間點它的同一個「想法」,所以我認爲最好爲它創建一個模型。

以上是否正確?

由於

+0

如果對Order和Dish的評論是不同的,那麼要麼必須找到一種方法來標準化他們的字段,或者只是創建OrderReview和DishReview模型 - 或者我在這裏錯過了一些東西? – MarsAtomic

+0

確實如此。但是,我可以讓路線一樣嗎?我希望能夠有審查/ 5可能是一個DishReview和審查/ 6是一個OrderReview ...我知道你可以在你的routes.rb中做「as:xyz」,但我可以統一它們在這個意義上 –

+0

對不起,如果這是一個愚蠢的問題,但只是想知道 –

回答

1

這是使用的情況下單個表繼承(STI)爲設計。當兩個模型之間共享大多數值時,STI可以讓您從另一個模型繼承它們。例如: -

class Review < ActiveRecord::Base; end 

class DishReview < Review 
    belongs_to :dish 
end 

class OrderReview < Review 
    belongs_to :order 
end 

然後存儲在一個新type列的審查類型,ActiveRecord的處理存儲他們均在同reviews表。評論表將需要菜餚和訂單的外鍵。

如果這些評論類型可能會有很大的差異......比如說你想在評論中添加辣味和甜味等,並且速度和友善等等,從單獨的表開始,一個用於DishReview,另一個用於OrderReview。然後,您可以使用模塊,服務,關注點等來共享它們之間的邏輯。您還可以將常用數據存儲在Review表中,並將DishReview和OrderReview鏈接與其一一對應。

+0

你知道如何做'belongs_to:buyer,:class_name =>「User」'',我可以爲Order和Review模型做同樣的事嗎? \t都可以有has_many:reviews,:class_name =>「OrderReview」和'has_many:reviews,:class_name =>「DishReview」' –

+0

@ArthurCollé,每個has_many不能有多個class_name。如果您正在做STI,則不需要,您只需鏈接到基礎評論表。如果你不做STI,那麼你可以創建一個共同的評論表,有兩種評論類型鏈接到,並仍然做'has_many:reviews'。 – Mori

相關問題