【问题标题】:Rails How to get all the grandchildren of an ojbectRails如何获取对象的所有孙子
【发布时间】:2017-11-16 15:20:02
【问题描述】:

我有 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 可以检查它,如果错误提供更正。

让我们与 bob 保持联系,并假设他善意地纠正了 5 个其他用户,即假设他很幸运地得到了其他用户的 3 个更正。

我希望能够做这样的事情

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

第一个很简单,因为它实际上只是 @bob.corrections 在引擎盖下。但我不知道如何实现后一个。有人可以帮忙吗?

更新

所以我尝试按照这样的建议使用 through(哦,实际上上面的问题模型实际上在我的代码中称为 Sentence。即 User => Sentence => Correction。)

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

但在控制台中出现此错误

ActiveRecord::HasManyThroughSourceAssociationNotFoundError: 找不到源 关联:模型中的更正 句子。尝试'has_many :corrections_received, :through => :句子,:来源=>'。是吗 之一:语言,:校正,:用户, 还是 :checker?

所以尝试了以下

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

但是得到了

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

不知道怎么回事……

【问题讨论】:

  • 如果您将 has_one 替换为 has_many,它将起作用。

标签: ruby-on-rails activerecord


【解决方案1】:

您可以像这样在用户模型中添加has_many through 关系

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

【讨论】:

  • 嗨,我在尝试实现它时遇到了一些错误。你能检查我上面的问题以获取更新吗
  • 您好,谢谢您的回复。我在这方面遇到了一些错误(请参阅我的更新)。你能弄清楚是什么原因造成的吗
【解决方案2】:

试试下面的方法:

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

【讨论】:

    【解决方案3】:

    通常,您应该可以使用:through 来做到这一点,但我不确定两个用户->更正关系是否可能。

    无论如何,模型类中的辅助方法应该足够简单。像这样。

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

    由于我是新手,欢迎指正!

    【讨论】:

    • 您应该始终避免这样做。因为如果您拥有大型数据集或随着数据的增长,这样的方法会显着影响性能。您必须针对此类内容执行带有条件的 sql 连接查询,而不是获取所有数据,然后根据某些条件丢弃它们。但无论如何,在 Rails 中你可以使用 has many through 关系
    • 感谢您的回复。我想到了这一点,但根据 nas 的回复,我担心性能。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多