【问题标题】:undefined method `id' for #<ActiveRecord::Associations::CollectionProxy []>#<ActiveRecord::Associations::CollectionProxy []> 的未定义方法“id”
【发布时间】:2016-04-13 08:19:33
【问题描述】:

可能会出现重复问题,但似乎无法找到解决此问题的方法。

我正在尝试获取属于CustomerOrders 的所有Payments

我有这个

# customer.rb
has_many :orders, dependent: :restrict_with_exception, class_name: "Shoppe::Order"

# order.rb
belongs_to :customer, class_name: 'Shoppe::Customer'

# payment.rb
belongs_to :order, class_name: 'Shoppe::Order'

# payment_controller.rb
def index
@payments ||= []
@customer_orders  = @customer.orders.ordered.load
  @customer_orders.each do |d|
  @payments << d.payments
  end
end

在视图中...

for payment in @payments
      tr
        td
          =  payment.id

我得到一个错误 -

undefined method `id' for #<ActiveRecord::Associations::CollectionProxy   []>

非常感谢任何解决此问题的帮助

【问题讨论】:

标签: ruby-on-rails-4 activerecord rails-activerecord


【解决方案1】:

您的问题是,您将ActiveRecord::Associations::CollectionProxy 对象(这是collectionPayment 实例)插入到数组中。

含义:现在你的数组是multi-dimentional 数组。所以,现在当你循环时,迭代器会得到collection 而不是单个payment 对象。

解决方案: 你需要flatten收藏

# payment_controller.rb
def index
@payments ||= []
@customer_orders  = @customer.orders.ordered.load
  @customer_orders.each do |d|
  @payments << d.payments
  end
end

@payments = @payments.flatten

现在每个项目都应该响应id方法

要了解有关ActiveRecord::Associations::CollectionProxy 的更多信息,请参阅 http://api.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html

让我知道这是否有效

【讨论】:

  • 感谢您的回复。但是,这样做会使“@payments”数组为空
  • 这意味着没有任何与orders相关的付款
  • 我很确定,如果我删除 flatten,相同的记录会弹出相同的错误。
猜你喜欢
  • 2016-11-18
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多