如何访问模特儿童的其他父母

时间:2015-08-19 18:39:03

标签: ruby-on-rails

我正在为一个不是由我制作的旧应用程序添加一个功能,这对于RoR来说相对较新,这对我来说会引起一些困惑。

我的模型名为reponseactivity_pointreport

response有两个父母,它们属于activity_pointreport

我正在尝试访问activity_points这样的do块:

report.responses.activity_points.activity.each do |a|

显然这不起作用。我收到错误消息:

undefined method `activity_points' for []:ActiveRecord::Relation

感谢任何可以帮助我解决这个小问题的人。

4 个答案:

答案 0 :(得分:3)

或者您可以在报告模型中添加类似的内容

has_many :responses
has_many :activity_points, :through => :responses
has_many :activities, :through => :activity_points

然后你可以这样做

report.activities.each do |a|

另一种做这种事情的方法,添加一个方法来报告和从另一方加入(获取活动对象)

def activities
  Activity.joins(:activity_points => :responses).where('responses.report_id = ?', id)
end

要做到这一点,如果你不需要,你不想创建Ruby对象。嵌套循环也是唯一项和排序的潜在问题。

答案 1 :(得分:1)

每个response都有多个activity_points,因此您应该遍历responses。此外,每个activity_point都有多个activities,所以:

report.responses.each do |r|
  r.activity_points.each do |ap|
    ap.activity.each do |a|
      # Do your thing
    end
  end
end

答案 2 :(得分:1)

首先,当您撰写report.responses时,会返回ActiveRecord array。由于activity_pointsarrays的未定义方法,因此您无法调用它。因此,调用此方法有两个条件:

  1. 你必须告诉你的应用程序数组的哪个元素将调用该方法。例如,report.responses.first.activity_pointsreport.responses.second.activity_points ...
  2. Response模型必须有has_many: activity_points才能调用此方法。

答案 3 :(得分:0)

您仍然可以使用循环,但这将需要多次数据库调用。因此,我的解决方案涉及直接数据库调用以提高效率。

Activity.includes(activity_point: {responses: :report}).where(reports: {id: report.id}).each do |a|
  #...
  #...
end