0

我有以下型號:活動關係:通過關聯檢索記錄?

class User < ActiveRecord::Base 
    has_many :survey_takings 
end 

class SurveyTaking < ActiveRecord::Base 
    belongs_to :survey 

    def self.surveys_taken # must return surveys, not survey_takings 
    where(:state => 'completed').map(&:survey) 
    end 

    def self.last_survey_taken 
    surveys_taken.maximum(:position) # that's Survey#position 
    end 
end 

我們的目標是能夠調用@user.survey_takings.last_survey_taken從控制器。 (這是人爲的,但隨它去吧;總體目標是能夠調用@user.survey_takings上的類方法,它們可以使用關聯的調查中的關係)。當我撥打.map(&:survey)時,surveys_taken將ActiveRelation摺疊成一個數組。是否有某種方式可以爲所有加入的調查返回一個關係?我不能做到這一點:

def self.surveys_taken 
    Survey.join(:survey_takings).where("survey_takings.state = 'completed'") 
end 

因爲@user.survey_takings.surveys_taken將加入所有完成survey_takings,而不僅僅是完成survey_takings爲@user

我想我要的是的

class User < ActiveRecord::Base 
    has_many :survey_takings 
    has_many :surveys_taken, :through => :survey_takings, :source => :surveys 
end 

等價,但我無法從SurveyTaking.last_survey_taken訪問surveys_taken關聯。

回答

1

如果我正確理解你想找到某個用戶完成的調查?如果是這樣,你可以這樣做:

Survey.join(:survey_takings).where("survey_takings.state = 'completed'", :user => @user) 

而且它看起來像代替:

def self.surveys_taken 
where(:state => 'completed').map(&:survey) 
end 

您可能需要使用範圍:

scope :surveys_taken, where(:state => 'completed') 
+0

類方法的工作原理,以及(儘管我總是用類<<自我),雖然我不知道什麼額外的'.MAP(:調查) '部分是爲了。它們可以像範圍一樣組合。 –

+0

那麼,我不能使用用於surveys_taken的範圍,因爲那樣會返回survey_takings,而不是調查。我當然可以在控制器中執行'Survey.join',但我無法在'SurveyTaking.surveys_taken'中執行此操作,因爲它是一種類方法,所以不存在'@ user'。更新問題以及.. –

+0

有幾百種方法可以做到這一點。我指出你在一個方向。你沒有描述你想要完成的具體事情,所以很難從你的破解代碼中推斷出你想要的。你可以使用範圍,他們不返回數組,並且看起來你有一個不需要的關聯。如果你真的只是想找到一個給定的用戶完成的調查,你可以用一行代碼,一個簡單的數據庫查詢,不需要額外的代碼。 –

0

我想我正在尋找的是這個:

class SurveyTaking < ActiveRecord::Base 
    def self.surveys_taken 
    Survey.joins(:survey_takings).where("survey_takings.state = 'completed'").merge(self.scoped) 
    end 
end 

這樣,SurveyTaking.surveys_taken返回任何人採取的調查,但@user.survey_takings.surveys_taken返回@user採取的調查。關鍵是merge(self.scoped)

正等待進一步的評論之前,我接受..