渲染缺少指定嵌套的对象包括

时间:2018-04-20 08:41:33

标签: ruby-on-rails ruby-on-rails-5.1

我正在将Rails应用程序从3.2迁移到5.1,它包含一个足够简单的模型,其中包含对批次产品类型的引用,

  create_table "batches", :force => true do |t|
    t.string   "code"
    t.integer  "product_id"
    t.boolean  "recalled",   :default => false
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

其中,(为清晰起见而编辑)

class Batch < ApplicationRecord

    validates_presence_of :product

    belongs_to :product
end

我正在使用will_paginate,所以我在我的模型中有以下摘录来返回记录表,

  def self.search(search, page)

    if search
      Batch.not_recalled.
        where('batches.code LIKE ? OR products.code LIKE ? OR products.name LIKE ?',
          "%#{search}%", "%#{search}%", "%#{search}%").
        references(:product).
        includes(:product).
        order(:code).
        page(page).per_page(30)
    else
      Batch.not_recalled.
        includes(:product).
        order(:code).
        page(page).per_page(30)
    end
  end

相应地,在我的控制器中,我有,

      # GET /batches/paginated
      def paginated

        @batches = Batch.search(params[:search], params[:page])

        respond_to do |format|
          format.html  # paginated.html.erb
          format.json { render json: @batches.to_json(include: [:product]) } # note the explicit 'include'
        end
      end

在部分渲染对象时,我有

<%= product = batch[:product] %> # Try and extract the nested record
<%= puts 'debug' %>
<%= puts batch.inspect %>
<%= puts product.inspect %>
<%= puts 'end debug' %>

<tr role="row" %> >
    <td ><%= batch[:code] %></td>
    <td><%= product ? product[:duplicate_batch] : 'N/A'  %></td>
    <td><%= product ? product[:code] : 'N/A' %></td>
    <td><%= product ? product[:name] : 'N/A' %></td>
    <td><%= link_to 'Show', batch %></td>
</tr>

现在,产品总是为零,而检查显示产品嵌套记录不包括在内。

我也可以查看JSON,我可以看到包含的产品&#39;只有当我明确地将它包含在控制器的format.json行中时,才能进入,如上所示。由于在HTML呈现格式中没有相应的语法来指定包含,因此我无法以HTML格式呈现嵌套产品。

真正好奇的是我在同一个应用程序中有另一个非常相似的模型,这对HTML也很好,没有明确的包含。

我知道ActiveRecord直到最后一分钟才加载,但我使用了包含will_paginate的内容,我不知道为什么这会是一个问题。检查显示记录,而不是ActiveRecord查询(我相信)。

两个问题:

  1. 为什么嵌套包含不会自动包含在内?
  2. 如果有的话 很好的理由,我如何指定它包括产品 HTML呈现?
  3. 感谢。

1 个答案:

答案 0 :(得分:0)

加入模型

scope :search, -> (search_param, page) do
    includes(:product).
    order(:code).
    paginate_page(page)
end

添加搜索查找部分,你应该是好的 我也会使用activeModelSerializer来序列化对象或 https://github.com/Netflix/fast_jsonapi

还要去rails控制台 Batch.search(code,1).to_json(include:[:product])看看是什么显示