首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rails中使用#includes,对Stocks表运行两次

在rails中使用#includes,对Stocks表运行两次
EN

Stack Overflow用户
提问于 2016-09-25 06:09:08
回答 1查看 13关注 0票数 0

在我的股票投资组合应用程序中,我循环通过transaction对象来获取我的投资组合显示页面中的股票信息。

代码语言:javascript
复制
<% @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对象定义为

代码语言:javascript
复制
def show
  @portfolio = Portfolio.includes(:transactions, :stocks).find(params[:id])
  @transaction = Transaction.new
end

我的模型定义为

代码语言:javascript
复制
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

当我访问一个公文包展示页面时,我的日志是这样的:

代码语言:javascript
复制
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语句在做什么。如果我已经有了需要的股票对象,为什么还要再去一次数据库呢?

EN

回答 1

Stack Overflow用户

发布于 2016-09-25 06:32:08

你能不能试试:

代码语言:javascript
复制
Portfolio.includes(transactions: [:stock])

我认为问题可能在于它包含了Portfolio上的关联,而不是Transaction上的关联,这意味着如果您执行了:@portfolio.stocks,它就不会发出另一个db调用,但是执行@transaction.stock.name就会发出调用。

让我知道这是否有效,是否有意义?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39681406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档