0

我在使用地图的地方有以下内容:

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

然后我希望能够在“last_activities”上使用“where”,但我不能这样做,因为 last_activities 是一个数组。我想做但不能做的是:

fun_activities = last_activities.where(:type => "fun")

我怎样才能在rails中完成这个?

更新:

报告 has_many 交易
Deal belongs_to 报告
Deal has_many 活动
Activity belongs_to deal

4

4 回答 4

1

有两种方法可以实现这一点:

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

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

于 2012-07-20T16:59:18.853 回答
0

使用squeel很容易在 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 建议的子选择。与生成的表进行连接也是可能的,但这需要更多的分组语句并且不是必需的,因为一个好的查询分析器应该能够将其转换为连接。

于 2012-07-20T22:04:26.590 回答
0

如果它们很少,您可以按照评论中的说明进行映射和选择

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)

你也应该all_last_activities_ids从查询中得到,但我现在没有时间找出如何去做。但是一个组子句应该会有所帮助。

于 2012-07-20T17:05:45.603 回答
0

如果您想使用 AR/SQL 查询,请执行以下操作:

Activity.joins(:deal).where(['deals.report_id = ? and activities.id in (select max(id) from activities group by deal_id)'], report.id)

这将允许像您在原始问题中想要的那样链接条件。然而,为了简单和可读性,您可能更喜欢选择/拒绝方法。

于 2012-07-20T17:07:38.490 回答