簡體   English   中英

has_many : 通過關聯通過兩個不同的關聯

[英]has_many :through association through two different associations

我有四個模型類:

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

我想查找特定組的所有事件。 我認為這是一個 has_many :through 關聯,但是如何在 Group 上指定一個 has_many 來查找項目組的個人博客中的所有事件? 當然,我可以指定兩個關聯並連接結果,但隨后我必須在 Ruby 中重新排序、限制、條件等,這可能是許多事件的性能噩夢。 我想在 ActiveRecord 中這樣做以避免這樣的噩夢。

您可以在 Group 類中定義一個方法,如下所示:

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 through”關聯。

為什么不這樣做:

class Group < ActiveRecord::Base
  has_many :projects
  has_many :personal_blogs

  def all_events
    projects.events + personal_blogs.events
  end
end

如果您需要一個可以預加載的關聯,您可以指定一個自定義的“來自”查詢,其中包含事件的組 ID。

class Group < ActiveRecord::Base
  has_many :projects
  has_many :personal_blogs
  has_many :events, -> {from(<<~SQL)}
    (
      SELECT DISTINCT e.*, g.id as group_id
      FROM events e
        LEFT JOIN projects p ON p.event_id = e.id
        LEFT JOIN personal_blogs pb ON pb.event_id = e.id
        INNER JOIN groups g ON g.id IN (p.group_id, pb.group_id)
    ) as events
  SQL
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM