2016-06-27 66 views
0

我正在爲一家餐廳打造一個小型系統。如何列出屬於其他型號的所有型號?

我目前被困在有效地列出屬於product_type的所有模型,其類型爲:food,beveragesapparel_items

每類產品都有多個種產品屬於它們例如food有很多wraps,許多salads,許多sandwiches

的這點是有一個按鈕,每一個產品類型的點擊時,根據所選類型的ID,將屬於它的所有模型列爲按鈕,然後您可以單擊其中任何一個,然後列出相關模型的數據庫記錄。

例如:食品,飲料=>點擊食品=>顯示按鈕:包裝,沙拉和三明治=>點擊包裹=>列出所有包裝

class ProductType < ActiveRecord::Base 
    has_many :apparel_items 
    has_many :chapata_items 
    has_many :combos 
    has_many :croissants 
    has_many :fruits 
    has_many :green_challenges 
    has_many :hot_drinks 
    has_many :infusions 
    has_many :juices 
    has_many :molletes 
    has_many :omelettes 
    has_many :salads 
    has_many :sandwiches 
    has_many :shakes 
    has_many :sincronizadas 
    has_many :slices 
    has_many :smooth_drinks 
    has_many :super_drinks 
    has_many :water_drinks 
    has_many :wrap_items 
end 

如何列出屬於所有車型到另一個,以便我可以有效地編程?

它會更好,以創建爲每個產品類型(食品,飲料,服裝產品)的模式,使只有這三個屬於產品類型模式?

+0

你應該在你的問題中包含你的模型定義。 –

+0

添加了模型定義。 –

回答

1

您可以使用ActiveRecord::Reflection檢查協會的任何模型。

所以Food.reflect_on_all_associations(:has_many)返回一個ActiveRecord::Reflection::HasManyReflection對象的數組,其中每個食物類型的一個表示您的Food模型has_many。這些反射中的每一個都有一個名稱,這是您聲明has_many關係時設置的名稱。

然後,您可以使用這些反射的名字打造的產品列表,像這樣:

food_product_types = Food.reflect_on_all_associations(:has_many).map(&:name) 

# 'food_product_types' equals [:wraps, :salads, :sandwiches, etc...] 
# Now, create buttons for each food product type 

當然,如果你的產品類型有沒有產品關聯,你需要將它們過濾掉。

+0

你可以用'Food.reflect_on_all_associations(:has_many).map(&:name)來簡化這個'' – jaydel

+0

@jaydel良好的調用!我更新了我的答案以使用您的簡化。 –

1

您的模式當然可以從一些反規範化中受益。設計方法有很多種,包括爲產品組分離模型。

但是,更重要的是,您應該考慮爲什麼要將所有各種產品放入不同的模型中。從使用它們的工作流程的角度來看,它們真的是不同的嗎?

也許這是值得的,只是保留Product模型中真正共享的一組字段,並將所有附加屬性放入Attribute模型中? product_type然後將成爲Product只是一個領域,你將能夠以直截了當和高性能的方式做很多美好的事情。