2014-07-21 40 views
1

我有一個菜食譜它有許多雜貨在這種情況下 - 什麼更好有很多或有很多通過?

class Dish < ActiveRecord::Base 
    has_many :groceries 

我正在cosidering - 我應該讓簡單的像上面的例子,但有,比方說, 100菜餚,每一個有西紅柿,胡蘿蔔,cucambers - 所以雜貨表將大 與同樣的食品雜貨或我應該使用有很多通過和做雜貨表 ,然後加入連接菜餚和雜貨,所以雜貨店表很小,說 只有西紅柿胡蘿蔔和cucambers,但連接表將很大,以連接所有的菜餚和雜貨。

如果沒關係我傾向於第一種 - 它的很多更簡單的程序......

回答

6

的優點「有許多通過」是雙重的...

首先,由於雜貨項目是表驅動你最大限度地減少拼寫錯誤和食譜中的變幻莫測(例如一個配方有「西紅柿」,另一個配方有「西紅柿」)

第二,如果你讓它有很多通過你可以使它成爲一個雙向關係,所以你可以做...

carrots = Grocery.find_by(name: "carrots") 

carrots.recipes # show all the recipes using carrots 
+0

+1此解決方案 – MrYoshiji

0

許多一對多

您通常需要使用一個many-to-many Rails中加入這樣的事情,因爲除非你每次dish實際上創建groceries是,它將是非常低效的&「WET」

在我看來,關聯這兩種數據類型的方式是使用連接模型 - 有兩種方法可以做到這一點:

根據您的系統需要如何工作,has_many :through可能比has_and_belongs_to_many稍微更多的工作;它的好處是,你可以附加很多不同的數據互傳的加入記錄,而has_and_belongs_to_many只有關聯兩個類型的記錄的


has_and_belongs_to_many

如果您沒有添加任何具體細節連接表,你會希望使用has_and_belongs_to_many

#app/models/dish.rb 
Class Dish < ActiveRecord::Base 
    has_and_belongs_to_many :groceries 
end 

#app/models/grocery.rb 
Class Grocery < ActiveRecord::Base 
    has_and_belongs_to_many :dishes 
end 

這將允許您創建下表:

#dishes_groceries 
dish_id | grocery_id 

因此允許你調用如下

@dish = Dish.find params[:id] 
@dish.grocies.each do |grocery| 
    grocery.name #-> "Carrot" 
end 

-

的has_many:通過

如果你想使用has_many :through,你就必須做出單獨的模型,這將允許您包含其他屬性(因爲其附帶的表將具有primary_key):

#app/models/dish.rb 
Class Dish < ActiveRecord::Base 
    has_many :dish_groceries 
    has_many :groceries, through: :dish_groceries 
end 

#app/models/dish_grocery.rb 
Class DishGrocery < ActiveRecord::Base 
    belongs_to :dish 
    belongs_to :grocery 
end 

#app/models/grocery.rb 
Class Grocery < ActiveRecord::Base 
    has_many :dish_groceries 
    has_many :dishes, through: :dish_groceries 
end 
相關問題