Rails如何获得一个对象的所有孙子

时间:2010-06-12 04:06:00

标签: ruby-on-rails activerecord

我有3个型号:

User
has_many :questions
has_many :corrections
end

Question
has_one :correction
belongs_to :user
end

Correction
belongs_to :user
belongs_to :question

因此,如果用户Bob提出问题,那么用户Terry可以检查它,如果错误提供了更正。

让我们留下鲍勃,并假设他对其他5位用户进行了善意的纠正,即让他们认为他很幸运能够从其他用户那里得到3次更正。

我希望能够做到这样的事情

@ bob.corrections_offered => 5个修正对象 @ bob.corrections_received => 3个修正对象

第一个很容易,因为它真的只是引擎盖下的@ bob.corrections。但我不知道如何实施后者。有人可以帮忙吗?

更新

所以我尝试使用通过如此建议(哦,实际上上面的问题模型实际上在我的代码中称为句子.I.e.User => Sentence => Correction。)

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

但在控制台中出现此错误

  

的ActiveRecord :: HasManyThroughSourceAssociationNotFoundError:   找不到来源   association(s):模型中的更正   句子。试试'has_many   :corrections_received,:through =>   :sentence,:source => ”。是吗   其中之一:语言,:纠正,:用户,   或者:检查员?

所以试过以下

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

但得到了

  

的ActiveRecord :: HasManyThroughSourceAssociationMacroError:   源反射宏无效   :has_one for has_many   :corrections_received,:through =>   :句子。使用:source指定   来源反思。

不确定哪里出错......

3 个答案:

答案 0 :(得分:5)

您可以在用户模型中添加has_many through关系,如此

class User
  #your usual relationships
  has_many :corrections_received, :through => :questions, :class_name => 'Correction'
end

答案 1 :(得分:2)

尝试以下方式:

has_many :corrections_received,:class_name=>'Correction',:conditions=>...

答案 2 :(得分:1)

通常情况下,您应该可以使用:through,但我不确定是否可以使用两个用户 - >校正关系。

在任何情况下,模型类中的辅助方法都应该足够简单。这样的事情。

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

由于我对这些东西不熟悉,欢迎更正!