我正在将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查询(我相信)。
两个问题:
感谢。
答案 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])看看是什么显示