القضبان: has_many مع تفاصيل إضافية؟
-
21-09-2019 - |
سؤال
على الرغم من أنني لست نيوبًا كاملاً لـ Ruby/Rails ، إلا أنني ما زلت أخضرًا جدًا وأحاول معرفة كيفية تنظيم بعض العلاقات النموذجية. أبسط مثال يمكنني التفكير فيه هو فكرة "الوصفات" للطهي.
تتكون الوصفة من مكون واحد أو أكثر والكمية المرتبطة بكل عنصر. افترض أن لدينا قائمة رئيسية في قاعدة البيانات لجميع المكونات. هذا يشير إلى نموذجين بسيطين:
class Ingredient < ActiveRecord::Base
# ingredient name,
end
class Recipe < ActiveRecord::Base
# recipe name, etc.
end
إذا أردنا فقط ربط الوصفات بالمكونات ، فهذا مبسط مثل إضافة ما هو مناسب belongs_to
و has_many
.
ولكن ماذا لو أردنا ربط معلومات إضافية بهذه العلاقة؟ كل Recipe
لديه واحد أو أكثر Ingredients
, ، لكننا نريد الإشارة إلى كمية Ingredient
.
ما هي طريقة القضبان لنمذجة ذلك؟ هل هو شيء على غرار أ has_many through
?
class Ingredient < ActiveRecord::Base
# ingredient name
belongs_to :recipe_ingredient
end
class RecipeIngredient < ActiveRecord::Base
has_one :ingredient
has_one :recipe
# quantity
end
class Recipe < ActiveRecord::Base
has_many :recipe_ingredients
has_many :ingredients, :through => :recipe_ingredients
end
المحلول
تحتوي الوصفات والمكونات على وجود علاقة كثيرة ، لكنك تريد تخزين معلومات إضافية للرابط.
في الأساس ما تبحث عنه هو نموذج انضمام غني. لكن علاقة HAS_AND_BELONGS_TO_MANY ليست مرنة بما يكفي لتخزين المعلومات الإضافية التي تحتاجها. بدلاً من ذلك ، ستحتاج إلى استخدام HAS_MANY: من خلال relatinship.
هكذا سأقوم بإعداده.
أعمدة الوصفات: التعليمات
class Recipe < ActiveRecord::Base
has_many :recipe_ingredients
has_many :ingredients, :through => :recipe_ingredients
end
الأعمدة الوصفة_
class RecipeIngredients < ActiveRecord::Base
belongs_to :recipe
belongs_to :ingredient
end
أعمدة المكونات: الاسم
class Ingredient < ActiveRecord::Base
has_many :recipe_ingredients
has_many :recipes, :through => :recipe_ingredients
end
سيوفر هذا تمثيلًا أساسيًا لما تبحث عنه. قد ترغب في إضافة التحقق من الصحة إلى الوصفات للتأكد من إدراج كل مكون مرة واحدة لكل وصفة ، ودخل رد الاتصال لتكرار في إدخال واحد.
نصائح أخرى
http://railsbrain.com/api/Rails-2.3.2/doc/index.html؟a=m001888&name=has_and_belongs_to_many
http://railsbrain.com/api/Rails-2.3.2/doc/index.html؟a=m001885&name=has_many
ماذا عن:
- المكون الطبقي (ينتمي إلى الوصفة ، ويحتوي على العديد من compedientRecipeCounts)
- وصفة فئة (تحتوي على العديد من المكونات ، لديها العديد من المكونات)
- class hedientRecipeCount (ينتمي إلى المكون ، ينتمي إلى الوصفة)
هذه ليست طريقة القضبان بقدر ما هي مجرد إنشاء علاقة أخرى بين البيانات في قاعدة البيانات. إنه ليس حقًا "لديه وينتمي إلى الكثيرين" لأن كل عنصر له عدد واحد فقط لكل وصفة ، وكل وصفة واحدة لكل مكون .. وهو نفس العدد.