سؤال

عند العمل مع جمعية متعددة الأشكال ، هل من الممكن تشغيل تضمين على النماذج الفرعية الموجودة فقط في بعض الأنواع؟

مثال:

class Container
  belongs_to :contents, :polymorphic => true
end
class Food
  has_one :container
  belongs_to :expiration
end
class Things
  has_one :container
end

في العرض ، سأريد أن أفعل شيئًا مثل:

<% c = Containers.all %>
<% if c.class == Food %>
  <%= food.expiration %>
<% end %>

لذلك ، أود أن أحرص على تحميل انتهاء الصلاحية عندما أقوم بتحميل C ، لأنني أعلم أنني سأحتاج إلى كل واحد منهم. هل هناك أي طريقة للقيام بذلك؟ مجرد تحديد منتظم: قم بتضمين أخطاء يحصل لي لأن كل الأنواع المرفقة لها مصمفة نموذج فرعي.

هل كانت مفيدة؟

المحلول

إجابة تم تحريرها

لقد اكتشفت مؤخرًا أن Rails تدعم تحميل الجمعيات المتعددة الأشكال عند تصفية عمود النوع متعدد الأشكال. لذلك ليست هناك حاجة لإعلان الجمعيات المزيفة.

class Container
  belongs_to :content, :polymorphic => true
end

الآن الاستعلام عن Container بواسطة container_type.

containers_with_food = Container.find_all_by_content_type("Food", 
                           :include => :content)

containers_with_thing = Container.find_all_by_content_type("Thing", 
                           :include => :content)

إجابة قديمة

هذا اختراق لأنه لا توجد طريقة مباشرة لتضمين الكائنات متعددة الأشكال في استعلام واحد.

class Container
  belongs_to :contents, :polymorphic => true
  # add dummy associations for all the contents.
  # this association should not be used directly
  belongs_to :food
  belongs_to :thing
end

الآن الاستعلام عن Container بواسطة container_type.

containers_with_food = Container.find_all_by_content_type("Food", 
                           :include => :food)

containers_with_thing = Container.find_all_by_content_type("Thing", 
                           :include => :thing)

ينتج عن ذلك اثنين من مكالمات SQL إلى قاعدة البيانات (في الواقع هو 4 مكالمات حيث تنفذ القضبان SQL واحدة لكل :include)

لا توجد طريقة للقيام بذلك في SQL واحد حيث تحتاج إلى تعيين عمود مختلف لأنواع المحتوى المختلفة.

مذكرة قانونية: الجمعيات الوهمية على Content لا ينبغي استخدام الفصل مباشرة لأنه سيؤدي إلى نتائج غير متوقعة.

على سبيل المثال: دعنا نقول الكائن الأول في contents يحتوي الجدول على الطعام.

Content.first.food # will work
Content.first.thing

المكالمة الثانية لن تعمل. قد يعطيك Thing كائن مع نفس المعرف مثل Food كائن أشار من قبل Content.

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