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を呼び出すことです。 surveys_takenは、.map(&:survey)を呼び出すと、ActiveRelationを配列に折りたたみます。代わりに参加したすべての調査の関係を返す方法はありますか? @user.survey_takings.surveys_takenすべて完了survey_takings、@userのためだけでなく、完成survey_takingsに参加してしまうため

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

:私はこれを行うことはできません。私は私が何をしたいと思い

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

これを行う方法は何百もあります。私はあなたを一方向に向けました。達成しようとしていることを正確に説明していないので、壊れたコードから必要なものを推定することは困難です。スコープを使用することはできますが、配列を返さないため、不要な関連付けがあるようです。特定のユーザーが完了したアンケートを真に見つけようとしているのであれば、1行のコード、単純なdbクエリー、余分なコードは必要ありません。 –

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が返す調査は@user.survey_takings.surveys_takenです。キーはmerge(self.scoped)です。私はわからないが、(私はいつもクラス<<自己を使用するが)クラスメソッドは、同様に動作

関連する問題