2016-09-24 47 views
0

在我的股票投資組合應用程序中,我通過交易對象循環來獲取我的投資組合顯示頁面中的股票信息。在導軌中使用#include,使兩次運行到股票表

<% @portfolio.transactions.each do |trans| %> 
    <tr> 
    <td class="col-md-1"><%= trans.stock.symbol %></td> 
    <td class="col-md-1"><%= number_to_currency(trans.stock.last_price) %></td> 
    <td class="col-md-1"><%= trans.stock.name %></td> 
    <td class="col-md-1"><%= trans.stock.stock_exchange %></td> 
    <td class="col-md-1"><%= trans.num_of_shares %></td> 
    </tr> 
<% end %> 

在portfolios_controller我@portfolio對象定義爲

def show 
    @portfolio = Portfolio.includes(:transactions, :stocks).find(params[:id]) 
    @transaction = Transaction.new 
end 

我的模型被定義爲

class Transaction < ActiveRecord::Base 
    belongs_to :portfolio 
    belongs_to :stock 
end 

class Stock < ActiveRecord::Base 
    has_many :transactions 
end 

class Portfolio < ActiveRecord::Base 
    belongs_to :user 
    has_many :transactions 
    has_many :stocks, through: :transactions 
end 

我的日誌是這樣的,當我打了一個投資組合顯示頁面:

Started GET "/portfolios/2" for ::1 at 2016-09-24 17:59:13 -0400 
Processing by PortfoliosController#show as HTML 
    Parameters: {"id"=>"2"} 
    Portfolio Load (0.2ms) SELECT "portfolios".* FROM "portfolios" 
    WHERE "portfolios"."id" = $1 LIMIT 1 [["id", 2]] 
    Transaction Load (0.4ms) SELECT "transactions".* FROM "transactions" 
    WHERE "transactions"."portfolio_id" IN (2) 
    Stock Load (0.3ms) SELECT "stocks".* FROM "stocks" WHERE 
    "stocks"."id" IN (3, 1, 14, 9) 
    Stock Load (0.3ms) SELECT "stocks".* FROM "stocks" 
    Rendered transactions/_form.html.erb (2.8ms) 
    Rendered portfolios/show.html.erb within layouts/application (5.5ms) 
    Rendered application/_nav.html.erb (0.7ms) 
Completed 200 OK in 39ms (Views: 33.8ms | ActiveRecord: 1.1ms) 

I對於股票負債報表正在做什麼事感到困惑。如果我已經有我需要的庫存對象,爲什麼還有另一次到數據庫的行程。

+0

您的控制器或視圖中是否有任何過濾器可能會觸發它?模型中還有什麼? –

+0

我已經盡我所能地再現了您的應用程序,並且我沒有看到第二個'Stock Load',因此我認爲您的詳細信息中包含此處包含的內容。 –

+0

我想通了。我遺漏了我也有一個交易表格。這是抓取股票對象的下拉列表,並導致第二個電話。 –

回答

0

可以嘗試:

Portfolio.includes(transactions: [:stock]) 

我認爲這個問題可能是,它包含在Portfolio的關聯,但不是在Transaction,這意味着,如果你做了:@portfolio.stocks,就不會犯另一個數據庫調用,但做@transaction.stock.name使它打電話。

讓我知道這是否有效,是否有意義?