許多一對多
您通常需要使用一個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
+1此解決方案 – MrYoshiji