سهولة استنساخ كائنات active_record بما في ذلك الارتباطات والعديد من العمليات ضمن الارتباطات والسمات.
انظر هنا.
كان الهدف هو التمكن من إعادة إنتاج كائنات ActiveRecord بسهولة وسرعة بما في ذلك العناصر التابعة لها، على سبيل المثال، نسخ منشور مدونة مع الاحتفاظ بالعلامات أو الفئات المرتبطة به.
سميت هذه الجوهرة "الأميبا" لأن الأميبا (أشكال الحياة الصغيرة) جيدة في التكاثر. كما يقوم أطفالهم وأحفادهم بإعادة إنتاج أنفسهم بسرعة وسهولة.
جوهرة ملحق ActiveRecord للسماح بتكرار كائنات السجل التابعة المرتبطة عند تكرار نموذج سجل نشط.
القضبان 5.2، 6.0، 6.1 متوافقة. بالنسبة لإصدارات Rails 4.2 إلى 5.1، استخدم الإصدار 3.x.
يدعم أنواع الارتباط التالية
has_many
has_one :through
has_many :through
has_and_belongs_to_many
خط DSL بسيط لتكوين الحقول المراد نسخها. يمكن تطبيق DSL على نماذج القضبان الخاصة بك أو استخدامه أثناء التنقل.
يدعم الأطفال STI (الوراثة في جدول واحد) الذين يرثون إعدادات الأميبا الخاصة بهم.
أنماط تكوين متعددة مثل الشاملة والحصرية والعشوائية (المعروف أيضًا باسم نسخ كل شيء).
يدعم استنساخ أبناء سجلات كثير إلى كثير أو مجرد الحفاظ على الارتباطات الأصلية
يدعم التنقيب التلقائي، أي النسخ المتكرر لسجلات الأطفال والأحفاد.
يدعم المعالجة المسبقة للحقول للمساعدة في الإشارة إلى التفرد والتأكد من سلامة بياناتك وفقًا لاحتياجات منطق عملك، على سبيل المثال، التعليق المسبق "نسخة من " أو نص مشابه.
يدعم المعالجة المسبقة للحقول باستخدام كتل lambda المخصصة حتى تتمكن من القيام بكل ما تريده بشكل أساسي، على سبيل المثال، إذا كنت بحاجة إلى بعض المنطق المخصص أثناء عمل النسخ.
يمكن للأميبا إجراء عمليات المعالجة المسبقة التالية في حقول السجلات المنسوخة
تعيين
إضافة مسبقة
إلحاق
يبطل
تخصيص
regex
نأمل أن تكون كما تتوقع:
جوهرة تثبيت الأميبا
أو أضفه فقط إلى ملف Gemfile الخاص بك:
جوهرة "الأميبا"
قم بتكوين نماذجك باستخدام أحد الأنماط أدناه ثم قم فقط بتشغيل طريقة amoeba_dup
على النموذج الخاص بك حيث يمكنك تشغيل طريقة dup
بشكل طبيعي:
p = Post.create(:title => "Hello World!", :content => "Lorum ipsum dolor")p.comments.create(:content => "أنا أحب ذلك!")p.comments.create(: content => "هذا سيء!") يضع Comment.all.count # يجب أن يكون 2my_copy = p.amoeba_dupmy_copy.saveputs Comment.all.count # يجب أن يكون 4
افتراضيًا، عند التمكين، ستقوم الأميبا بنسخ أي وجميع سجلات الأطفال المرتبطة تلقائيًا وربطها بالسجل الأصلي الجديد.
يمكنك تكوين السلوك ليشمل فقط الحقول التي تدرجها أو ليشمل فقط الحقول التي لم تستبعدها. من بين الثلاثة، سيكون النمط العشوائي هو الأكثر أداءً، يليه النمط الشامل، وسيكون النمط الحصري هو الأبطأ بسبب الحاجة إلى فحص صريح إضافي في كل حقل. من المحتمل أن يكون هذا الاختلاف في الأداء ضئيلًا بدرجة كافية بحيث يمكنك اختيار النمط الذي تريد استخدامه بناءً على الأسهل في القراءة والكتابة، ومع ذلك، إذا كانت شجرة البيانات كبيرة بما يكفي وتحتاج إلى التحكم في الحقول التي سيتم نسخها، فمن المحتمل أن يكون النمط الشامل هو الأفضل اختيار من النمط الحصري.
يرجى ملاحظة أن هذه الأمثلة ليست سوى تقديرات تقريبية فضفاضة لسيناريوهات العالم الحقيقي وقد لا تكون واقعية بشكل خاص، فهي فقط لغرض توضيح استخدام الميزة.
هذه هي حالة الاستخدام الأساسية وستؤدي ببساطة إلى تمكين نسخ أي ارتباطات معروفة.
إذا كان لديك بعض النماذج لمدونة حول مثل هذا:
فئة النشر < ActiveRecord::Base has_many :commentsendclass تعليق < ActiveRecord::Base ينتمي إلى :postend
ما عليك سوى إضافة كتلة تكوين الأميبا إلى النموذج الخاص بك واستدعاء طريقة التمكين لتمكين نسخ سجلات الأطفال، مثل هذا:
فئة النشر < ActiveRecord::Base has_many :تعليقات الأميبا ممكنة تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
سيتم نسخ سجلات الأطفال تلقائيًا عند تشغيل طريقة amoeba_dup
.
إذا كنت تريد نسخ بعض الارتباطات فقط دون غيرها، فيمكنك استخدام النمط الشامل:
فئة النشر < ActiveRecord::Base has_many :تعليقات has_many: العلامات has_many :المؤلفون الأميبا قابلة للتنفيذinclude_association :tagsinclude_association :authors تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
إن استخدام النمط الشامل داخل كتلة الأميبا يعني في الواقع أنك ترغب في تمكين الأميبا، لذلك ليست هناك حاجة لتشغيل طريقة التمكين، على الرغم من أنها لن تؤذي أيضًا:
فئة النشر < ActiveRecord::Base has_many :تعليقات has_many: العلامات has_many :المؤلفون الأميبا doinclude_association :tagsinclude_association :authors تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
يمكنك أيضًا تحديد الحقول المراد نسخها عن طريق تمرير مصفوفة. إذا قمت باستدعاء include_association
بقيمة واحدة، فسيتم إلحاقها بقائمة الحقول المضمنة بالفعل. إذا قمت بتمرير مصفوفة، فسوف تقوم مصفوفتك بالكتابة فوق القيم الأصلية.
فئة النشر < ActiveRecord::Base has_many :تعليقات has_many: العلامات has_many :المؤلفون الأميبا doinclude_association [:tags, :authors] تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
ستقوم هذه الأمثلة بنسخ علامات المنشور ومؤلفيه وليس تعليقاته.
سيؤدي النمط الشامل، عند استخدامه، إلى تعطيل أي نمط آخر تم تحديده مسبقًا تلقائيًا.
إذا كان لديك حقول تريد تضمينها أكثر من الحقول التي تريد استبعادها، فقد ترغب في تقليل كمية الكتابة والقراءة التي يتعين عليك القيام بها باستخدام النمط الحصري. سيتم نسخ جميع الحقول التي لم يتم استبعادها بشكل صريح:
فئة النشر < ActiveRecord::Base has_many :تعليقات has_many: العلامات has_many :المؤلفون الأميبا تفعل استبعاد_الرابطة :تعليقات تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
يقوم هذا المثال بنفس الشيء مثل مثال النمط الشامل، حيث سيقوم بنسخ علامات المنشور ومؤلفيه ولكن ليس تعليقاته. كما هو الحال مع النمط الشامل، ليست هناك حاجة لتمكين الأميبا بشكل صريح عند تحديد الحقول المراد استبعادها.
سيؤدي النمط الحصري، عند استخدامه، إلى تعطيل أي نمط آخر تم تحديده مسبقًا تلقائيًا، لذلك إذا قمت بتحديد حقول التضمين، ثم اخترت بعض حقول الاستبعاد، فسوف تقوم طريقة exclude_association
بتعطيل النمط الشامل المحدد مسبقًا ومسح أي حقول تضمين مقابلة .
أيضًا إذا كنت بحاجة إلى مسار شرط إضافي لعلاقة التضمين أو الاستبعاد، فيمكنك مسار اسم الطريقة إلى الخيار :if
.
فئة النشر < ActiveRecord::Base has_many :تعليقات has_many: العلامات الأميبا doinclude_association :تعليقات، إذا: :شعبية؟ نهاية بالتأكيد مشهور؟ إعجابات > 15 نهاية
بعد الاتصال بـ Post.first.amoeba_dup
إذا كانت likes
أكبر من 15 من جميع التعليقات، فسيتم تكرارها أيضًا، ولكن في حالة أخرى - لن يتم استنساخ أي علاقات. سيكون نفس السلوك لـ exclude_association
.
كن على علم ! إذا كتبت:
فئة النشر < ActiveRecord::Base has_many :تعليقات has_many: العلامات الأميبا doexclude_association :tagsinclude_association :comments، if: :popular؟ نهاية بالتأكيد مشهور؟ إعجابات > 15 نهاية
وسيتم اختيار استراتيجية الإدماج بغض النظر عن نتيجة popular?
استدعاء الأسلوب (نفس الشيء بالنسبة للموقف العكسي).
إذا كنت تستخدم علاقة متعدد إلى متعدد، فيمكنك إخبار الأميبا بعمل نسخ مكررة من السجلات الأصلية ذات الصلة بدلاً من مجرد الحفاظ على الارتباط مع السجلات الأصلية. يعد الاستنساخ أمرًا سهلاً، ما عليك سوى إخبار الأميبا بالحقول التي سيتم استنساخها بنفس الطريقة التي تخبرها بها الحقول التي يجب تضمينها أو استبعادها.
فئة النشر < ActiveRecord::Base has_and_belongs_to_many :warnings has_many :post_widgets has_many :widgets, :through => :post_widgets الأميبا قابلة للاستنساخ [:widgets, :warnings] تحذير endendclass < ActiveRecord::Base has_and_belongs_to_many :postsendclass PostWidget < ActiveRecord::Base ينتمي إلى: القطعة ينتمي إلى :postendclass القطعة < ActiveRecord::Base has_many :post_widgets has_many :posts, :through => :post_widgetsend
سيؤدي هذا المثال إلى تكرار التحذيرات والأدوات الموجودة في قاعدة البيانات. إذا كان هناك في الأصل 3 تحذيرات في قاعدة البيانات، فعند تكرار المنشور، سينتهي بك الأمر بـ 6 تحذيرات في قاعدة البيانات. وهذا يتناقض مع السلوك الافتراضي حيث سيتم فقط إعادة ربط منشورك الجديد بأي تحذيرات موجودة مسبقًا ولن يتم تكرار تلك التحذيرات نفسها.
افتراضيًا، تتعرف الأميبا وتحاول نسخ أي أطفال من أنواع الارتباط التالية:
لديه واحد
لديه الكثير
لديه وينتمي للكثيرين
يمكنك التحكم في أنواع الارتباط التي تنطبق عليها الأميبا باستخدام طريقة recognize
داخل كتلة تكوين الأميبا.
فئة النشر < ActiveRecord::Base has_one :التكوين has_many :تعليقات has_and_belongs_to_many :tags الأميبا تعرف [:has_one, :has_and_belongs_to_many] تعليق endendclass < ActiveRecord::Base ينتمي إلى: علامة postendclass < ActiveRecord::Base has_and_belongs_to_many :postsend
سينسخ هذا المثال بيانات تكوين المنشور ويحتفظ بالعلامات المرتبطة بالمنشور الجديد، لكنه لن ينسخ تعليقات المنشور لأن الأميبا ستتعرف فقط على ارتباطات has_one
و has_and_belongs_to_many
الفرعية وتنسخها، وفي هذا المثال، التعليقات ليست ارتباطات has_and_belongs_to_many
.
إذا كنت ترغب في منع الحقل العادي (الذي لا يستند إلى has_*
) من الاحتفاظ بقيمته عند النسخ، فيمكنك "إزالة" الحقل أو "إبطاله"، كما يلي:
موضوع الفئة < ActiveRecord::Base has_many :postsendclass Post < ActiveRecord::Base ينتمي إلى :الموضوع has_many :تعليقات الأميبا يمكن تفعيلها nullify :date_publishednullify :topic_id تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
سيؤدي هذا المثال إلى نسخ جميع تعليقات المنشور. كما سيؤدي أيضًا إلى إلغاء تاريخ النشر وفصل المشاركة عن موضوعها الأصلي.
على عكس الأنماط الشاملة والحصرية، فإن تحديد الحقول الخالية لن يؤدي تلقائيًا إلى تمكين الأميبا من نسخ جميع سجلات الأطفال. كما هو الحال مع أي كائن سجل نشط، سيتم استخدام قيمة الحقل الافتراضية بدلاً من nil
في حالة وجود قيمة افتراضية عند الترحيل.
إذا كنت ترغب فقط في تعيين حقل إلى قيمة عشوائية على جميع الكائنات المكررة، فيمكنك استخدام التوجيه set
. على سبيل المثال، إذا أردت نسخ كائن يشتمل على نوع ما من عملية الموافقة المقترنة به، فمن المحتمل أنك قد ترغب في تعيين حالة الكائن الجديد لتكون مفتوحة أو "قيد التقدم" مرة أخرى.
فئة النشر < ActiveRecord::Base جرعة الأميبا :state_tracker => "open_for_editing" نهاية
في هذا المثال، عندما يتم تكرار منشور، سيتم دائمًا إعطاء حقل state_tracker
الخاص به قيمة open_for_editing
للبدء.
يمكنك إضافة سلسلة إلى بداية حقل الكائن المنسوخ أثناء مرحلة النسخ:
فئة النشر < ActiveRecord::Base الأميبا doenableprepend :title => "نسخة من" نهاية
يمكنك إضافة سلسلة إلى نهاية حقل الكائن المنسوخ أثناء مرحلة النسخ:
فئة النشر < ActiveRecord::Base الأميبا doenableappend :title => "نسخة من" نهاية
يمكنك تشغيل استعلام بحث واستبدال في حقل الكائن المنسوخ أثناء مرحلة النسخ:
فئة النشر < ActiveRecord::Base الأميبا doenableregex :contents => {:replace => /dog/, :with => 'cat'} نهاية
يمكنك تشغيل طريقة أو طرق مخصصة للقيام بأي شيء تريده، ببساطة قم بتمرير كتلة lambda، أو مجموعة من كتل lambda إلى توجيه customize
. يجب أن يكون لكل كتلة نفس الشكل، مما يعني أن كل كتلة يجب أن تقبل معلمتين، الكائن الأصلي والكائن المنسوخ حديثًا. ويمكنك بعد ذلك أن تفعل ما يحلو لك، مثل هذا:
فئة النشر < ActiveRecord::Base الأميبا doprepend :title => "مرحبا بالعالم! "customize(lambda { |original_post,new_post| if original_post.foo == "bar"new_post.baz = "qux" end})append :comments => "... أعرف ماذا أنا أقول؟" نهاية
أو هذا باستخدام مصفوفة:
فئة النشر < ActiveRecord::Base has_and_belongs_to_many :tags الأميبا doinclude_association :tagscustomize([ lambda do |orig_obj,copy_of_obj|# الأشياء الجيدة تذهب هنا النهاية، lambda do |orig_obj,copy_of_obj|# المزيد من الأشياء الجيدة تذهب هنا النهاية]) نهاية
تم تمرير كتل Lambda لتخصيص التشغيل، بشكل افتراضي، بعد كل عمليات النسخ والمعالجة المسبقة الميدانية. إذا كنت ترغب في تشغيل طريقة قبل أي تخصيص أو معالجة مسبقة للحقل، فيمكنك استخدام override
ابن عم customize
. الاستخدام هو نفس ما ورد أعلاه.
فئة النشر < ActiveRecord::Base الأميبا doprepend :title => "مرحبا بالعالم! "override(lambda { |original_post,new_post| if original_post.foo == "bar"new_post.baz = "qux" end})append :comments => "... أعرف ماذا أنا أقول؟" نهاية
يمكنك تطبيق معالج مسبق واحد على حقول متعددة في وقت واحد.
فئة النشر < ActiveRecord::Base الأميبا doenableprepend :title => "نسخة من"، :contents => "المحتويات المنسوخة:" نهاية
يمكنك تطبيق توجيهات معالجة مسبقة متعددة على نموذج واحد في وقت واحد.
فئة النشر < ActiveRecord::Base الأميبا doprepend :title => "نسخة من ", :contents => "المحتويات الأصلية: "append :contents => " (النسخة المنسوخة)"التعبير العادي :contents => {:replace => /dog/, :with => ' قطة'} نهاية
يجب أن يؤدي هذا المثال إلى شيء مثل هذا:
آخر = Post.create( :title => "مرحبا بالعالم"، :contents => "أنا أحب الكلاب، الكلاب رائعة.")new_post = post.amoeba_dupnew_post.title # "Copy of Hello World"new_post.contents # "المحتوى الأصلي: أنا أحب القطط، القطط رائعة. (نسخة منسوخة)"
كما هو الحال مع nullify
، لا تعمل توجيهات المعالجة المسبقة على تمكين نسخ السجلات الفرعية المرتبطة تلقائيًا. إذا تم استخدام توجيهات المعالجة المسبقة فقط وكنت تريد نسخ سجلات الأطفال ولم يتم توفير قائمة include_association
أو exclude_association
، فلا يزال يتعين عليك تمكين نسخ سجلات الأطفال بشكل صريح عن طريق استدعاء طريقة التمكين من داخل كتلة الأميبا في النموذج الخاص بك.
يمكنك استخدام مجموعة من طرق التكوين داخل كتلة الأميبا الخاصة بكل نموذج. أنواع الارتباطات المعترف بها لها الأولوية على قوائم التضمين أو الاستبعاد. الأسلوب الشامل له الأسبقية على الأسلوب الحصري، وهذان الأسلوبان الصريحان لهما الأسبقية على الأسلوب العشوائي. بمعنى آخر، إذا قمت بإدراج الحقول المراد نسخها، فستقوم الأميبا بنسخ الحقول التي أدرجتها فقط، أو ستقوم فقط بنسخ الحقول التي لم تستبعدها حسب الحالة. بالإضافة إلى ذلك، إذا لم يتم التعرف على نوع الحقل، فلن يتم نسخه، بغض النظر عما إذا كان يظهر في قائمة التضمين أم لا. إذا كنت تريد أن تقوم الأميبا بنسخ جميع سجلات طفلك تلقائيًا، فلا تقم بإدراج أي حقول باستخدام include_association
أو exclude_association
.
بناء جملة المثال التالي صالح تمامًا، وسيؤدي إلى استخدام النمط الشامل. لا يهم الترتيب الذي تستدعي به طرق التكوين داخل كتلة الأميبا:
موضوع الفئة < ActiveRecord::Base has_many :postsendclass Post < ActiveRecord::Base ينتمي إلى :الموضوع has_many :تعليقات has_many: العلامات has_many :المؤلفون الأميبا doexclude_association :authorsinclude_association :tagsnullify :date_publishedprepend :title => "نسخة من "إلحاق :contents => " (نسخة منسوخة)" regex :contents => {:replace => /dog/, :with => 'cat'}include_association :authorsenablenullify :topic_id تعليق endendclass < ActiveRecord::Base ينتمي إلى :postend
سيقوم هذا المثال بنسخ جميع علامات المنشور ومؤلفيه، ولكن ليس تعليقاته. كما سيؤدي أيضًا إلى إلغاء تاريخ النشر وفصل المشاركة عن موضوعها الأصلي. كما سيقوم أيضًا بمعالجة حقول المنشور مسبقًا كما في مثال المعالجة المسبقة السابق.
لاحظ أنه بسبب الأسبقية، يتم استخدام النمط الشامل ولا يتم استشارة قائمة حقول الاستثناء مطلقًا. بالإضافة إلى ذلك، تعد طريقة enable
زائدة عن الحاجة لأن الأميبا يتم تمكينها تلقائيًا عند استخدام include_association
.
يتم تشغيل توجيهات المعالجة المسبقة بعد نسخ السجلات الفرعية ويتم تشغيلها بهذا الترتيب.
الحقول الفارغة
يسبق
يلحق
بحث واستبدال
لا تؤثر توجيهات المعالجة المسبقة على قوائم التضمين والاستبعاد.
قد تتسبب في استمرار الأميبا في نسخ السلسلة بقدر ما تريد، ما عليك سوى إضافة كتل الأميبا إلى كل نموذج ترغب في نسخ أبنائه. ستعود الأميبا تلقائيًا إلى أي أحفاد ممكّنين وستنسخهم أيضًا.
فئة النشر < ActiveRecord::Base has_many :تعليقات الأميبا ممكنة تعليق endendclass < ActiveRecord::Base ينتمي إلى :post has_many : التقييمات الأميبا ممكنة تصنيف endendclass < ActiveRecord::Base ينتمي إلى :commentend
في هذا المثال، عندما يتم نسخ منشور، ستقوم الأميبا بنسخ جميع تعليقات المنشور وستقوم أيضًا بنسخ تقييمات كل تعليق.
يعد استخدام has_one :through
الارتباط أمرًا بسيطًا، فقط تأكد من تمكين الأميبا في كل نموذج باستخدام ارتباط has_one
وسوف تقوم الأميبا بالتنقل تلقائيًا وبشكل متكرر، كما يلي:
فئة المورد < ActiveRecord::Base has_one :الحساب has_one :history, :through => :account الأميبا ممكنة حساب endendclass < ActiveRecord::Base ينتمي إلى: المورد has_one :history الأميبا ممكنة سجل endendclass < ActiveRecord::Base ينتمي إلى :accountend
نسخ has_many :through
الارتباطات يعمل تلقائيًا. يقومون بالنسخ بنفس طريقة الارتباط has_and_belongs_to_many
، مما يعني أنه لا يتم نسخ السجلات الفرعية الفعلية، بل يتم الاحتفاظ بالارتباطات ببساطة. يمكنك إضافة بعض المعالجات الأولية الميدانية إلى النموذج الأوسط إذا أردت ولكن هذا ليس ضروريًا تمامًا:
تجميع الفئة < ActiveRecord::Base has_many :manifests has_many :parts, :through => :manifests الأميبا ممكنة بيان endendclass < ActiveRecord::Base ينتمي إلى: التجميع ينتمي إلى: جزء الأميبا doprepend :notes => "نسخة من" جزء endendclass < ActiveRecord::Base has_many :manifests has_many :تجميعات، :من خلال => :البيانات الأميبا ممكنة نهاية
يمكنك التحكم في كيفية قيام الأميبا بنسخ الكائن الخاص بك، بسرعة، عن طريق تمرير كتلة التكوين إلى طريقة الأميبا الخاصة بالنموذج. طريقة التكوين ثابتة ولكن يتم تطبيق التكوين على أساس كل مثيل.
فئة النشر < ActiveRecord::Base has_many :تعليقات الأميبا doenableprepend :title => "نسخة من" تعليق endendclass < ActiveRecord::Base ينتمي إلى :postendclass PostsController < ActionController def duplicate_a_postold_post = Post.create( :title => "Hello World", :contents => "Lorum ipsum")old_post.class.amoeba do prepend :contents => "إليك نسخة: "endnew_post = old_post.amoeba_dupnew_post.title # يجب أن يكون "نسخة من Hello World"new_post.contents # يجب أن يكون "Here's a نسخة: لوروم ipsum"new_post.save نهاية
إذا كنت تستخدم وراثة الجدول الفردي التي يوفرها ActiveRecord، فقد تتسبب في قيام الأميبا بمعالجة فئات الأطفال تلقائيًا بنفس الطريقة التي يعالج بها آباؤهم. كل ما عليك فعله هو استدعاء طريقة propagate
داخل كتلة الأميبا للفئة الأصلية ويجب نسخ جميع الفئات الفرعية بطريقة مماثلة.
create_table :products, :force => true do |t| t.string :type # هذا هو عمود STI # هذه تنتمي إلى جميع المنتجات t.string :العنوان ر.عشري: السعر #هذه للقمصان فقط t.decimal :sleeve_length t.decimal :collar_size #هذه مخصصة لأجهزة الكمبيوتر فقط t.integer :ram_size t.integer :hard_drive_sizeendclass المنتج < ActiveRecord::Base has_many : الصور has_and_belongs_to_many :categories الأميبا قابلة للنشر قميص endendclass < كمبيوتر Productendclass < Productendclass ProductsController def some_methodmy_shirt = Shirt.find(1)my_shirt.amoeba_dupmy_shirt.save# يجب أن يكون هذا القميص الآن:# - لديه نسخته الخاصة من جميع صور الوالدين# - يكون في نفس فئات الوالد نهاية
يجب أن يكرر هذا المثال جميع الصور والأقسام المرتبطة بهذا القميص، وهو فرع من المنتج
افتراضيًا، يستخدم النشر أسلوب الأبوة الخاضعة، مما يعني أنه سيتم تطبيق إعدادات التكوين على الأصل، ولكن أي إعدادات فرعية، إذا كانت موجودة، ستضيف إما إلى الإعدادات الأصلية أو تستبدلها اعتمادًا على كيفية استدعاء أساليب DSL.
يمكنك تغيير هذا السلوك، أو ما يسمى "نمط التربية"، لإعطاء الأفضلية لإعدادات الوالدين أو لتجاهل أي وجميع إعدادات الطفل.
سيفضل أسلوب الأبوة والأمومة :relaxed
إعدادات الوالدين.
فئة المنتج < ActiveRecord::Base has_many : الصور has_and_belongs_to_many :sections الأميبا تفعل استبعاد_الرابطة :انتشار الصور :استرخاء قميص endendclass < المنتج include_association : الصور include_association :sections prepend :title => "نسخة من"end
في هذا المثال، سيتم تجاهل إعدادات include_association
المتعارضة على الطفل وسيتم استخدام إعداد exclude_association
الأصلي،