Ruby on rails 如何执行类似于地图的功能,但仍然能够使用活动记录方法?

Ruby on rails 如何执行类似于地图的功能,但仍然能够使用活动记录方法?,ruby-on-rails,arrays,activerecord,Ruby On Rails,Arrays,Activerecord,我使用地图的地方如下: last_activities = report.deals.map do |deal| deal.activities.last end 然后我希望能够在“last_activities”上使用“where”,但我不能这样做,因为last_activities是一个数组。我想做但不能做的是: fun_activities = last_activities.where(:type => "fun") 如何在rails中实现这一点 更新: 报告中有许多交易

我使用地图的地方如下:

last_activities = report.deals.map do |deal|
  deal.activities.last
end
然后我希望能够在“last_activities”上使用“where”,但我不能这样做,因为last_activities是一个数组。我想做但不能做的是:

fun_activities = last_activities.where(:type => "fun")
如何在rails中实现这一点

更新:

报告中有许多交易
交易属于要报告的单位
交易有很多活动

活动属于交易

实现此目的有两种方法:

1) 继续使用数组。也就是说,使用select选择有趣的活动: fun|u activities=last|u activities.select{a|a.type==“fun”}


2) 定义一条SQL语句,用于直接选择您想要的活动或尝试使用ActiveRecord查询实现相同的活动-这将具有更好的性能或不将所有内容加载到数组中的优势。

如果它们很少,您可以按注释中所述进行映射和选择

all_last_activities = report.deals.map do |deal|
  deal.activities.last
end

fun_last_activities = all_last_activities.select do |act|
  act.type == "fun"
end
如果有很多记录,最好使用以下查询

all_last_activities_ids = report.deals.map do |deal|
  deal.activities.last.id
end

Activity.where(type: "fun").find(all_last_activities_ids)

此外,您还应该从查询中获取所有上次活动ID,但我现在没有时间了解如何操作。但是一个group子句应该会有所帮助。

如果您想使用AR/SQL查询,下面介绍如何操作:

Activity.joins(:deal).where(['deals.report_id = ? and activities.id in (select max(id) from activities group by deal_id)'], report.id)
这将允许像您在原始问题中希望的那样的链接条件。 然而,为了简单和可读性,您可能更喜欢选择/拒绝方法。

使用ruby,无需编写原始SQL查询即可轻松表达:

max_ids_rel = Activity.group{deal_id}.select{max(id)}

Activity.joins{deal}.where{(deal.report_id == my{report.id}) && id.in(max_ids_rel)}

这将生成一个类似于HargrimmTheBleak建议的子选择。与生成的表的联接也是可能的,但这需要更多的分组语句,并且不是必需的,因为一个好的查询分析器应该能够将其转换为联接。

报表、交易和活动之间的关系是什么?拒绝和选择有什么错?为什么在这么简单的情况下需要SQL语句?我不需要SQL语句;只是想说明我想要实现的目标。你会建议拒绝并选择?如果最后一个是另一种类型的,你不会想要那些“有趣”的。或者你想在每项交易中都选择最后一项有趣的活动?只需查看与交易相关的最后一项活动,然后从中选择有趣的活动。