HAS_MANY: من خلال الارتباط من خلال اثنين من الجمعيات المختلفة
-
23-09-2019 - |
سؤال
لدي أربعة فصول نموذجية:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
end
class Project < ActiveRecord::Base
has_many :events, :as => :event_producer
end
class PersonalBlog < ActiveRecord::Base
has_many :events, :as => :event_producer
end
class Event < ActiveRecord::Base
belongs_to :event_producer, :polymorphic => true
end
أريد أن أجد كل الأحداث لمجموعة معينة. أعتقد أن هذا هو ass_many: من خلال الارتباط ، ولكن كيف يمكنني تحديد has_many على المجموعة التي تجد جميع الأحداث في المشاريع أو personal_blogs من مجموعة؟ بالطبع ، يمكنني تحديد رابطتين وأسلوب النتائج ، ولكن بعد ذلك يجب علي إعادة التورم والحد والشرط ، وما إلى ذلك في روبي ، والتي يمكن أن تكون كابوسًا للأداء مع العديد من الأحداث. أرغب في القيام بذلك في ActivereCord لتجنب مثل هذا الكابوس.
لا يوجد حل صحيح
نصائح أخرى
يمكنك تحديد طريقة في فئة المجموعة مثل التالي:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def events
Event.find(:all, :conditions => ['(type = ? AND event_producer_id IN (?)) OR (type = ? AND event_producer IN (?))', 'project', project_ids, 'personal_blog', personal_blog_ids])
end
end
إذا كنت لا تحب SQL مثل الجهاز السابق ، فمن الممكن دائمًا استخدام ميراث الجدول المفرد. هذا الحل يعتمد على سمات الفصول والسلوك, ، ولكن سيسمح لك باستخدام جمعية "has_many من خلال".
لماذا لا تفعل فقط:
class Group < ActiveRecord::Base
has_many :projects
has_many :personal_blogs
def all_events
projects.events + personal_blogs.events
end
end
لا تنتمي إلى StackOverflow