私は、次のモデルがあります:アクティブな関係:関連付けを介してレコードを取得していますか?
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協会にアクセスすることはできません。
私は受け入れる前に、さらなるコメントを待っている
...何余分な 'の.map(&:調査) 'の部分はのためです。彼らはスコープのように構成可能です。 –
surveys_takenにスコープを使用することはできません。これはアンケートではなくsurvey_takingsを返すためです。私は確かにコントローラで 'Survey.join'を行うことができますが、' SurveyTaking.surveys_taken'ではクラスメソッドなのでできません。したがって '@ user'はありません。質問も同様に更新してください。 –
これを行う方法は何百もあります。私はあなたを一方向に向けました。達成しようとしていることを正確に説明していないので、壊れたコードから必要なものを推定することは困難です。スコープを使用することはできますが、配列を返さないため、不要な関連付けがあるようです。特定のユーザーが完了したアンケートを真に見つけようとしているのであれば、1行のコード、単純なdbクエリー、余分なコードは必要ありません。 –