HAS_MANY: من خلال الارتباط من خلال اثنين من الجمعيات المختلفة

StackOverflow https://stackoverflow.com/questions/2344220

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top