سؤال

على الرغم من أنني لست نيوبًا كاملاً لـ 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

ماذا عن:

  1. المكون الطبقي (ينتمي إلى الوصفة ، ويحتوي على العديد من compedientRecipeCounts)
  2. وصفة فئة (تحتوي على العديد من المكونات ، لديها العديد من المكونات)
  3. class hedientRecipeCount (ينتمي إلى المكون ، ينتمي إلى الوصفة)

هذه ليست طريقة القضبان بقدر ما هي مجرد إنشاء علاقة أخرى بين البيانات في قاعدة البيانات. إنه ليس حقًا "لديه وينتمي إلى الكثيرين" لأن كل عنصر له عدد واحد فقط لكل وصفة ، وكل وصفة واحدة لكل مكون .. وهو نفس العدد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top