假设您在其中一个模型中有一个关联,如下所示:
class User
has_many :articles
end
现在假设您需要获取 3 个数组,一个用于昨天写的文章,一个用于最近 7 天写的文章,一个用于最近 30 天写的文章。
当然你可以这样做:
articles_yesterday = user.articles.where("posted_at >= ?", Date.yesterday)
articles_last7d = user.articles.where("posted_at >= ?", 7.days.ago.to_date)
articles_last30d = user.articles.where("posted_at >= ?", 30.days.ago.to_date)
但是,这将运行 3 个单独的数据库查询。更有效的是,您可以这样做:
articles_last30d = user.articles.where("posted_at >= ?", 30.days.ago.to_date)
articles_yesterday = articles_last30d.select { |article|
article.posted_at >= Date.yesterday
}
articles_last7d = articles_last30d.select { |article|
article.posted_at >= 7.days.ago.to_date
}
当然,这是一个人为的例子,并不能保证数组选择实际上会比数据库查询快,但让我们假设它是。
我的问题是:有什么方法(例如一些 gem)可以通过确保您简单地指定关联条件来消除此问题的方式编写此代码,并且应用程序本身将决定是否需要执行另一个数据库查询或不是?
ActiveRecord 本身似乎并没有适当地解决这个问题。您被迫在每次查询数据库或将关联视为数组之间做出决定。