2016-04-12 3 views
0

Возможно, возникнет Дублированный вопрос, но, похоже, он не нашел способ решить это.undefined method `id 'for # <ActiveRecord :: Ассоциации :: CollectionProxy []>

Я пытаюсь получить все Payments для Orders, принадлежащих Customer.

Я получил эту

# 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 []> 

Любая помощь в решении этого высоко ценится

+0

еще немного ошибка backtrace пожалуйста; нам нужно знать, какая часть вашего кода является преступником; не стесняйтесь вставлять BT – illusionist

+0

@illusionist - https://gist.github.com/anonymous/a8c7c0ae045da4527940531264ed2259. Спасибо! – dev

ответ

0

Ваша проблема в том, что вы являетесь я nserting ActiveRecord::Associations::CollectionProxy объектов (что является collection из Payment экземпляров) в массив.

Смысл: теперь массив представляет массив 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

Позвольте мне знать, если это работает

+0

Благодарим вас за ответ. Тем не менее, это делает пул «@payments» пустым – dev

+0

Это означает, что никаких платежей, связанных с «заказами» – illusionist

+0

, я не сомневаюсь. Я уверен, что если я удалю сглаживание, то такая же ошибка появится для той же записи. – dev