2012-02-03 44 views
1

我有一個應用程序,企業可以在這裏申請稅款和申請延期稅。 (擴展名是請求說:「我需要更多的時間來申請。」)你會如何加入屬於同一記錄而沒有N + 1的兩條記錄?

我有以下關係:

Business has_many :tax_filings (one per year) 
TaxFiling belongs_to :business 

Business has_many :tax_extensions (one per year) 
TaxExtension belongs_to :business 

當我表明稅務申報的名單,我希望每個申請,以顯示是否它有一個相應的擴展名。但是我不確定如何在沒有N + 1查詢的情況下做到這一點。

現在我有TaxFiling這個方法:

def extension 
    TaxExtension.where(:business_id => business_id, :year => year).first 
end 

所以每次我打電話TaxFiling#extension時間,它的另一個數據庫查詢。

我加了一個範圍爲TaxFilingjoins擴展上business_idyear,但我不知道怎麼去TaxFiling#extension使用,如果沒有具有兩種模式之間的關係聲明。

我該怎麼做?

+0

也許看起來很明顯,人們會查詢商家與「連接」的列表和擴展,並從那裏去。但不幸的是,列表和擴展可能屬於不同的用戶,他們都不必擁有該業務。所以這在這裏不起作用。 – 2012-02-03 20:29:27

+0

我不確定,用戶需要做什麼? – 2012-02-03 20:36:37

+0

@SergioTulentsev - 是的,也許這是更困惑,而不是幫助。我只是想解釋一下,爲什麼我不會執行'business.tax_filing'和'business.tax_extension',而是必須從備案到擴展遍歷應用特定的原因。 – 2012-02-03 20:41:19

回答

1

我想你想要的是.includes方法,以便在加載TaxFiling模型時進行急切加載。如果你做這樣的事情:

TaxFiling.includes(:business => [:tax_extensions]) 

Rails會相關的業務和擴展加載到內存中,使用三種查詢(每個模型之一),而不是N次查詢。

+0

這看起來像我想要的。是否有可能在'tax_extensions'上以某種方式放置'where',以確保它與提交文件的同一年? – 2012-02-03 20:39:47

+0

當然。一旦你使用了'.includes',你就可以參考包含的模型,就好像你已經加入了它們一樣,所以你可以在那裏添加'.where('tax_extensions.year = tax_filings.year')'。 – MrTheWalrus 2012-02-03 21:11:08

相關問題