1

我正在使用 paper trail gem 来跟踪订单 Web 应用程序的版本更改。我无法显示 has_many 版本

订购型号:

class Order < ActiveRecord::Base
  has_paper_trail
  has_many :line_items, dependent: :destroy, inverse_of: :order, order: "position", autosave: true
end

订单项型号:

class LineItem < ActiveRecord::Base
  belongs_to :order, inverse_of: :line_items
  has_paper_trail
end

订单控制器:

@order = Order.find(params[:id])
@versions = PaperTrail::Version.where(item_id: params[:id]).order('created_at ASC')
@line_items = LineItem.find_all_by_order_id(params[:id])
@line_item_versions = @line_items.versions

历史html:

<% @line_item_versions.each_with_index do |version, index| %>
  <b>Version: </b><%= index + 1 %><br/>
  Event ID: <%= version.id %><br/>
  <b>Target:</b> <%= version.item_type %>
  <small>(id: <%= version.item_id %>)</small>; <b>action</b> <%= version.event %>;<br/>
<% end %>

问题是找到.versions单个对象(来自.find)时的工作。但是,当将对象数组(来自.find_all_by)传递给.versions它时,它会返回此错误

undefined method `versions' for #<Array:0x007f859d37eb30>
4

1 回答 1

1

您正在定义:

@line_items = LineItem.find_all_by_order_id(params[:id])

这意味着@line_items是几个 LineItem 记录的数组。然后,您调用:

@line_item_versions = @line_items.versions

但该.versions方法是 LineItem (one line_item has_many versions) 的实例方法。这会导致错误undefined method 'versions' for Array@line_items这里是一个数组)。


要解决这个问题, 我认为您应该执行以下操作(但有很多选择,具体取决于您要执行的操作):

<% @line_items.each do |line_item| %>
  <%= line_item.name %>

  <% line_item.versions.each_with_index do |version, index| %>
    <b>Version: </b><%= index + 1 %><br/>
    Event ID: <%= version.id %><br/>
    <b>Target:</b> <%= version.item_type %>
    <small>(id: <%= version.item_id %>)</small>; <b>action</b> <%= version.event %>;<br/>
  <% end %>
<% end %>
于 2014-10-08T15:02:23.517 回答