2017-03-01 60 views
0

我試圖重構,有很多的has_many的型號範圍:通過涉及在連接表的條件協會Rails的避免重複加入對已加入和合並

class Assignment 
    has_many :assignment_reviewers 
    has_many :preferred_assignment_reviewers, -> { preferred } 
    # more of these for different types of reviewers 

    has_many :reviewers, through: :assignment_reviewers 
    has_many :preferred_reviewers, through: :preferred_assignment_reviewers 
    # more of these 

我添加了以下範圍在審閱

class Reviewer 
    scope :preferred, -> do 
    joins(:assignment_reviewers).merge(AssignmentReviewer.preferred) 

,這樣我可以做

assignment.reviewers.preferred 

,而不是使用的has_many

assignment.preferred_reviewers 

但是,在重複INNER前者結果JOIN

INNER JOIN `assignment_reviewers` `assignment_reviewers_reviewers` 
ON `assignment_reviewers_reviewers`.`reviewer_id` = `reviewers`.`id` 
INNER JOIN `assignment_reviewers` 
ON `reviewers`.`id` = `assignment_reviewers`.`reviewer_id` 

看來我有三種選擇:

  1. 保持定義has_manys和的has_many:得來的每一個(缺點:很多在已經是神級的模型上的特定關聯)
  2. 使用範圍(下側:重複連接)
  3. 使用合併直接

    assignment.reviewers.merge(AssignmentReviewer.preferred) 
    

    (缺點:不是能言善辯)

我傾向於選擇選項2,因爲更清晰的代碼,我猜測額外的加入不會對績效有重大影響。

任何建議/有沒有更好的選擇,我錯過了?

回答

0

我想通了,我喜歡比三我列出更好的解決方案:

我添加了一個擴展塊到我的has_many:通過聲明

has_many :reviewers, through: :assignment_reviewers do 
    def preferred 
    merge(AssignmentReviewer.preferred) 
    end 
end 

雖然我仍然不得不宣佈大​​量的擴展,這是一個比每個has_many聲明has_many和has_many都要簡潔得多,因爲我需要