【发布时间】:2013-04-22 10:00:13
【问题描述】:
假设您在其中一个模型中有这样的关联:
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 本身似乎并没有适当地解决这个问题。您必须在每次查询数据库或将关联视为数组之间做出决定。
【问题讨论】:
-
你想摆脱什么?额外的数组,额外的查询,还是只是打字?
-
在我的实际代码中,我通常不知道是否已经加载了某些关联。我想编写不需要关心这个的代码,并且仍然总是进行最少数量的数据库查询。
-
我不认为有任何开箱即用的解决方案。跟踪所有条件和加载的数据需要付出很大的努力。更不用说数据库可以在幕后更改的事实。您需要手动创建最佳查询。为此,您可以使用技巧使其变得简单。
标签: ruby-on-rails ruby-on-rails-3 activerecord associations