有时候我编写的代码可以简化如下:
user.items.active.each { |i| ...do something... }
...some stuff...
user.items.recent.each { |i| ...do something else... }
...some other stuff...
user.items.weird.active.each { |i| ...do whatever... }
项目是用户和活动的has_many关联,最近和奇怪的是范围。问题是每个作用域都会对数据库进行单独调用 - 而如果每个用户只有几个项目,那么获取所有这些项目并“离线”过滤它们会更有效。所以我可以将上面改写为:
user.items.select { |i| i.active? }.each { |i| ...do something... }
...some stuff...
user.items.select { |i| i.created_at > 7.days.ago }.each { |i| ...do something else... }
...some other stuff...
user.items.select { |i| i.weirdness > 50 and i.active? }.each { |i| ...do whatever... }
哪个会做我想要的,但看起来很糟糕...在用户上定义active_items,recent_items,weird_active_items方法会有所帮助,但请注意组合范围更容易。有没有更多的“Rails方式”来做到这一点?就像在关系上添加自定义方法一样?