Rails Как достать всех внуков из ojbect - PullRequest
4 голосов
/ 12 июня 2010

У меня есть 3 модели:

User
has_many :questions
has_many :corrections
end

Question
has_one :correction
belongs_to :user
end

Correction
belongs_to :user
belongs_to :question

Так что, если пользователь Боб задает вопрос, то пользователь Терри может проверить его, и если его неправильно предложить исправление.

Давай останемся с Бобом и предположим,он любезно исправил 5 других пользователей, то есть и предположил, что ему повезло получить 3 исправления от других пользователей.

Я хочу иметь возможность сделать что-то подобное

@bob.corrections_offered=> 5 объектов коррекции @ bob.corrections_received => 3 объекта коррекции

первый из них прост, так как его действительно просто @ bob.corrections под капотом.Но я не знаю, как реализовать последний.Кто-нибудь может помочь?

ОБНОВЛЕНИЕ

Так что я попытался использовать через, как предложено, вот так (О, и на самом деле модель вопроса выше на самом деле называется предложением в моем коде. Т.е. Пользователь=> Sentence => Correction.)

has_many :sentences
has_many :corrections_received, :through => :sentences, :class_name => 'Correction'

, но получил эту ошибку в консоли

ActiveRecord :: HasManyThroughSourceAssociationNotFoundError: Не удалось найти ассоциацию источника (ей): Исправление в моделиПредложение.Попробуйте 'has_many: corrections_received,: through =>: предложения,: источник =>'.Это один из: language,: correction,: user или: checker?

Итак, попробовал следующее

has_many :corrections_received, :through => :sentences, :source => :correction 

, но получил

ActiveRecord :: HasManyThroughSourceAssociationMacroError: Недопустимый макрос отражения источника: has_one для has_many: corrections_received,: through =>: предложения.Используйте: source, чтобы указать источник отражения.

не уверен, что происходит не так ...

Ответы [ 3 ]

5 голосов
/ 12 июня 2010

Вы можете добавить has_many through отношение в вашей пользовательской модели, например,

class User
  #your usual relationships
  has_many :corrections_received, :through => :questions, :class_name => 'Correction'
end
2 голосов
/ 12 июня 2010

Попробуйте следующим образом:

has_many :corrections_received,:class_name=>'Correction',:conditions=>...
1 голос
/ 12 июня 2010

Как правило, вы должны быть в состоянии сделать это с : через , но я не уверен, возможны ли две зависимости пользователь-> коррекция.в модельном классе должно быть достаточно просто.Примерно так.

  def corrections_received
    result = Array.new
    questions.each do |q|
      if q.correction
        result.push q.correction
      end
    end
    result
  end

Поскольку я новичок в этом, исправления приветствуются!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...