我正在为一个不是由我制作的旧应用程序添加一个功能,这对于RoR来说相对较新,这对我来说会引起一些困惑。
我的模型名为reponse
,activity_point
和report
response
有两个父母,它们属于activity_point
和report
。
我正在尝试访问activity_points
这样的do块:
report.responses.activity_points.activity.each do |a|
显然这不起作用。我收到错误消息:
undefined method `activity_points' for []:ActiveRecord::Relation
感谢任何可以帮助我解决这个小问题的人。
答案 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_points
是arrays
的未定义方法,因此您无法调用它。因此,调用此方法有两个条件:
report.responses.first.activity_points
或report.responses.second.activity_points
... Response
模型必须有has_many: activity_points
才能调用此方法。 答案 3 :(得分:0)
您仍然可以使用循环,但这将需要多次数据库调用。因此,我的解决方案涉及直接数据库调用以提高效率。
Activity.includes(activity_point: {responses: :report}).where(reports: {id: report.id}).each do |a|
#...
#...
end