2015-09-18 66 views
0

我在查找屬於Econ_Report的最後一條Econ_Result。我想爲索引視圖上的每個Econ_Report顯示Econ_Result的最後一條記錄(按「release_date」排序)。在控制器我試圖採取的所有報告的列表,並使用找到最後的結果如下:在索引視圖Ruby查找最近的記錄值有很多

@econ_reports = EconReport.all 
if @econ_reports.econ_results.size >= 1 
    @last_result = @econ_report.econ_results.last.release_date 
end 

econ_report.econ_results.size作品時,我把它放在每個循環。當我嘗試調用最後一條記錄的值時,我遇到了一些報告尚未得到結果(臨時問題)的問題,因此我將它扔進if,然後檢查當前失敗的控制器。

在此先感謝菜鳥的幫助。

+0

使用'@econ_reports.econ_results.count> 1'或'@ econ_reports.econ_results.any?' – dimakura

回答

0

由於@econ_reportsEconReport對象的集合,你不能叫喜歡.econ_results上有一個實例方法。

@econ_reports.each do |econ_report| 
    if econ_report.econ_results.any? 
    last_result = econ_report.econ_results.last 
    end 
end 

然而,這可能是一個大集合@econ_reports非常低效的:相反,你只能在集合中調用它的實例與econ_report.econ_results兩條線路將分別查詢數據庫,這意味着你將查詢該數據庫獨立於集合中的每個econ_report。這就是所謂的N+1 query problem

幸運的是,在鏈接的討論,Rails有一個內置的解決方案,優化的代碼,所以你只能查詢一次數據庫:

<% @econ_reports.includes(:econ_results).each do |econ_report| %> 
    <% if econ_report.econ_results.any? %> 
    <% last_result = econ_report.econ_results.last %> 
    # do something to display last_result 
    <% end %> 
<% end %> 
+0

它工作到一個點eirikir。我將代碼放在控制器中的索引下的econ_reports的代碼中,並且它確實拉起了最後一個值,而不考慮具體的報告記錄。換句話說,最後一個值是275,000,它出現在視圖中的每條記錄上,而不是隻有一條記錄,其中最後一條記錄的值爲 要獲得這個遍歷每個報告記錄,我需要將這個代碼放在其他地方嗎?需要進一步完善它嗎? –

+0

@ M.Wood我不確定你的意思。這段代碼會爲最後一個'econ_result'分配'last_result'給每個*'econ_report' - 我推測你會在塊*內的'last_result'記錄*上做些什麼。因此,它在視圖中效果更好(請參閱我的編輯)。如果這不是你想要的,你可以使用示例更具體地描述你的內容嗎? – eirikir

+0

我發現我的錯誤。因爲我在一個報表中引用了這個值,所以我必須減少代碼以排除.each do調用,因爲它在表的範圍內是多餘的。通過使用 '<%if econ_report.econ_results.any? %> <%last_result = econ_report.econ_results.last%> <%= last_result.report_value%> <% end %>' 它的工作原理 –

0

如果你只是想發佈之日起,你可以嘗試:

@last_result = @econ_report.econ_results.order('release_date DESC').limit(1).pluck(:release_date).first 

值得一提的是一個Ruby if聲明一般是這樣的:

if condition 
end 

then幾乎總是即使它省略被允許。

+0

感謝您的反饋。上面的解決方案適用於具有變量@econ_report的單個報表的顯示視圖。但是,當我嘗試在索引上設置@last_result變量時,由於未定義的方法,@econ_report不起作用(它當前僅在show,edit,update,destroy中設置)並且變量@ econ_reports.econ_results錯誤'nconCresults'爲nil:NilClass –

+0

進一步闡明,如果@concon_reports.econ_results.size> = 1,我會調用它,我得到錯誤 –

+0

你想要最後一個*每個*報告還是最後一個爲*所有*報告? – tadman