Активная связь: получение записей через ассоциацию? - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть следующие модели:

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 сворачивает ActiveRelation в массив, когда я вызываю .map(&:survey). Есть ли способ вернуть отношение для всех объединенных опросов? Я не могу просто сделать это:

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

потому что @user.survey_takings.surveys_taken присоединится к всем завершенным опросам_отчетов, а не только к завершенным опросам_тестирований для @user.

Полагаю, что я хочу, это эквивалент

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

но я не могу получить доступ к этой ассоциации surveyys_taken с SurveyTaking.last_survey_taken.

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Если я правильно понимаю, вы хотите найти заполненные опросы определенного пользователя? Если это так, вы можете сделать:

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 голосов
/ 09 сентября 2011

Я думаю, что я ищу это:

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).

Жду дальнейших комментариев, прежде чем я приму ..

...