سؤال

يا قوم،

تريد التأكد من أنني أفهم هذا بشكل صحيح. ويرجى تجاهل القضية للميراث هنا (Sentientbeing)، تحاول التركيز بدلا من ذلك على النماذج متعددة الأشكال في has_many: من خلال العلاقات. ومع ذلك، فكر في ما يلي ...

class Widget < ActiveRecord::Base
  has_many :widget_groupings

  has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
  has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end

class Person < ActiveRecord::Base
  has_many :widget_groupings, :as => grouper
  has_many :widgets, :through => :widget_groupings
end

class Alien < ActiveRecord::Base
  has_many :widget_groupings, :as => grouper
  has_many :widgets, :through => :widget_groupings  
end

class WidgetGrouping < ActiveRecord::Base
  belongs_to :widget
  belongs_to :grouper, :polymorphic => true
end

في عالم مثالي، أود، بالنظر إلى القطعة وشخص، افعل شيئا مثل:

widget.people << my_person

ومع ذلك، عندما أفعل ذلك، لاحظت أن "النوع" من "الهامور" هو دائما فارغة في تطبيقات Widget_Groupings. ومع ذلك، إذا كان لدي شيء مثل ما يلي:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person}) 

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

شكرا على اي مساعدة!

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

المحلول

هناك القضية المعروفة مع القضبان 3.1.1 يكسر هذه الوظيفة. إذا كنت تواجه هذه المشكلة أولا حاول الترقية، فقد تم إصلاحه في 3.1.2

أنت قريب جدا. المشكلة هي أنك تؤدي استخدام الخيار المصدر. : يجب أن يشير المصدر إلى العلاقة التي ينتمي إليها تعدد الأشكال. ثم كل ما عليك فعله هو تحديد: Source_Type للعلاقة التي تحاول تحديدها.

يجب أن يسمح لك هذا الإصلاح لنموذج القطعة بالقيام بالضبط ما تبحث عنه.

class Widget < ActiveRecord::Base
  has_many :widget_groupings

  has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person'
  has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien'
end

نصائح أخرى

كما ذكر أعلاه، هذا لا يعمل مع القضبان 3.1.1 بسبب وجود خطأ في: المصدر، ولكنه ثابت في القضبان 3.1.2

لديه الكثير: من خلال والجوليمورفية لا تعمل معا. إذا حاولت الوصول إليها مباشرة، يجب أن رمي خطأ. إذا لم أكن مخطئا، فعليك تسليم Widget Widget.people وروتين الدفع.

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

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