NoMethodError (неопределенный метод `created_at' для nil:NilClass)

У меня есть следующий код Rails в моем conversations_controller:

Пользователь может быть: master или rookie.

@conversations = current_user.master.conversations.all
@conversations = @conversations.sort_by { |c| c.messages.last.created_at }.reverse

Но при запуске я получаю no method error за created_at. Если я сделаю puts вот так:

puts "Sorted: #{@conversations.map { |c| c.messages.last}}"

это дает мне следующий ответ:

Sorted: [#<Message id: 9, content: "some content", user_id: 3, conversation_id: 1, created_at: "2017-03-01 00:00:36", updated_at: "2017-03-01 00:00:36", attachment_url: []>, nil, #<Message id: 11, content: "new message", user_id: 3, conversation_id: 6, created_at: "2017-03-01 15:15:58", updated_at: "2017-03-01 15:15:58", attachment_url: []>]

Если я получаю created_at, то почему я не могу извлечь последние сообщения created_At для сравнения и сортировки?

При выполнении простого

puts "The conversations sorted are: #{@conversations.map { |c| c.messages}}"

Дает мне следующий ответ:

The conversations sorted are: [#<ActiveRecord::Associations::CollectionProxy [#<Message id: 1, content: "Hey there! This is my first message.", user_id: 1, conversation_id: 1, created_at: "2017-02-28 23:57:46", updated_at: "2017-02-28 23:57:46", attachment_url: []>, #<Message id: 2, content: "Thank you for your message. I am a coach.", user_id: 3, conversation_id: 1, created_at: "2017-02-28 23:57:46", updated_at: "2017-02-28 23:57:46", attachment_url: []>, #<Message id: 9, content: "adsdadasd", user_id: 3, conversation_id: 1, created_at: "2017-03-01 00:00:36", updated_at: "2017-03-01 00:00:36", attachment_url: ["https://ace-up-www.s3.amazonaws.com/message-attachments%2Fbd450b1e-f85c-47ec-94c7-c539809f8d68%2Frecommendation-bg.jpg"]>]>, #<ActiveRecord::Associations::CollectionProxy []>, #<ActiveRecord::Associations::CollectionProxy [#<Message id: 10, content: "Add a new message", user_id: 8, conversation_id: 6, created_at: "2017-03-01 14:58:29", updated_at: "2017-03-01 14:58:29", attachment_url: []>, #<Message id: 11, content: "new message", user_id: 3, conversation_id: 6, created_at: "2017-03-01 15:15:58", updated_at: "2017-03-01 15:15:58", attachment_url: []>]>]

Как видите, есть пустое #<ActiveRecord::Associations::CollectionProxy []>, которое, вероятно, транслируется в nil. Любая помощь в отладке этого?


person anonn023432    schedule 01.03.2017    source источник
comment
в массиве nil значений, вот здесь ... updated_at: "2017-03-01 00:00:36", attachment_url: []>, nil, #<Message id: 11..., видите nil?   -  person fanta    schedule 01.03.2017
comment
@fanta, вы правы, и я заметил то же самое сразу после публикации вопроса, поэтому я отредактировал свой вопрос, добавив больше деталей.   -  person anonn023432    schedule 01.03.2017
comment
почему бы вам не попробовать что-то вроде @conversations = current_user.master.conversations.joins(:messages).order("messages.created_at DESC") ?, тогда ваш код будет быстрее.   -  person fanta    schedule 01.03.2017
comment
Это вернет несколько объектов Conversation. По одному для каждого сообщения в беседе. Вы можете добавить .distinct, чтобы исправить это.   -  person Marc Rohloff    schedule 01.03.2017


Ответы (1)


Ошибка возникла, когда вы попытались получить атрибут созданного при преобразовании последнего сообщения, у которого на самом деле нет сообщений.

@conversations = current_user.master.conversations.joins(:messages)
@conversations = @conversations.sort_by { |c| c.messages.last.created_at }.reverse

При присоединении сообщений к разговорам будет получен только разговор с хотя бы одним сообщением, поэтому я думаю, что проблема будет исправлена.

person Vishal Taj PM    schedule 02.03.2017