在我的股票投资组合应用程序中,我循环通过transaction对象来获取我的投资组合显示页面中的股票信息。
<% @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中的My @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)我不知道第二个Stock Load语句在做什么。如果我已经有了需要的股票对象,为什么还要再去一次数据库呢?
发布于 2016-09-25 06:32:08
你能不能试试:
Portfolio.includes(transactions: [:stock])我认为问题可能在于它包含了Portfolio上的关联,而不是Transaction上的关联,这意味着如果您执行了:@portfolio.stocks,它就不会发出另一个db调用,但是执行@transaction.stock.name就会发出调用。
让我知道这是否有效,是否有意义?
https://stackoverflow.com/questions/39681406
复制相似问题