比方說,你在你這樣的車型之一有ASSOCATION:高效的ActiveRecord關聯條件
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本身似乎沒有適當地覆蓋這個問題。您不得不每次查詢數據庫或將關聯視爲數組。
你想擺脫什麼?額外的數組,額外的查詢,或只是打字? – Matzi 2013-04-22 11:56:56
在我的實際代碼中,我通常不知道某個關聯是否已經加載。我想編寫一些不需要關心這個的代碼,並且仍然始終使數據庫查詢的數量達到最小。 – 2013-04-22 13:07:53
我不認爲有任何現成的解決方案。這需要很大的努力來跟蹤所有條件和加載的數據。不要談論數據庫可以在幕後改變的事實。您需要手動創建最佳查詢。爲此,您可以使用技巧來簡化它。 – Matzi 2013-04-22 13:30:21