【发布时间】:2017-08-19 08:04:53
【问题描述】:
我正在尝试优化一个非常笨拙的查询。我想根据某些成员数据包逻辑返回用户记录的 activerecord 关联。
ids = User.joins(:memberships).includes(:memberships).select do |user|
if user.memberships.count <= 1
user.membership_packet_sent_at.blank?
else
user.membership_packet_sent_at.blank? && user.current_membership.created_more_than_30_days_ago?
end
end.uniq.map(&:id)
User.where(id: ids)
我在上面遇到的问题是我必须进行两次查询,因为我不知道如何使用 select 来返回活动记录关联而不是数组。
- 如何从 select 中返回 activerecord 关联?
- 有没有更好的方法让我在选择块中组织我的逻辑?
编辑:
经过一些重构,我能够将一些选择逻辑移动到方法中:
```
ids = User.joins(:memberships)
.where(membership_packet_sent_at: nil)
.select(&:current_membership_packet_expired?)
.uniq
.map(&:id)
User.where(id: ids)
```
仍然遇到如何返回 activerecord 关联的问题
【问题讨论】:
-
我不会说这很笨拙。初学者通常遇到的主要优化错误是 N+1(迭代内的查询),您已通过
preload防止了这种错误。 -
@maxple 公平点。在清理了select中的方法并阅读了aegis的解决方案之后,它更有意义了。谢谢。
标签: ruby-on-rails ruby activerecord