Извлечение атрибутов связанного объекта

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть сообщение, в котором много комментариев. Комментарии имеют тело и заголовок

  => #<ActiveRecord::Associations::CollectionProxy [#<Comment id: 1, author: "jack", body: "how do you like dem apples?", post_id: 1, created_at: "2016-09-29 02:11:00", updated_at: "2016-09-29 02:11:00">]> 
2.3.0 :005 > Post.first.comments
  Post Load (0.5ms)  SELECT  "posts".* FROM "posts"  ORDER BY "posts"."id" ASC LIMIT 1
  Comment Load (0.2ms)  SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = ?  [["post_id", 1]]
 => #<ActiveRecord::Associations::CollectionProxy [#<Comment id: 1, author: "jack", body: "how do you like dem apples?", post_id: 1, created_at: "2016-09-29 02:11:00", updated_at: "2016-09-29 02:11:00">]> 
2.3.0 :006 > Post.first.comments.body

NoMethodError:   Comment Load (0.2ms)  SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = ?  [["post_id", 1]]
undefined method `body' for #<Comment::ActiveRecord_Associations_CollectionProxy:0x007f9bef0a33a8>
  

В приведенном выше коде вы можете видеть, что я пытаюсь получить атрибут body из сообщения, в котором есть комментарий, но я получаю исключение no method. Как мне получить данные связанных объектов в таких ситуациях?

Ответ №1:

1) Вы получаете ошибку, потому что вы вызываете body коллекцию комментариев, а не один экземпляр Comment класса.

2) Чтобы заставить его работать:

 # select the comment, which's body you want to get
Post.first.comments.first.body
  

Post.first.comments это коллекция, вы можете обрабатывать ее как массив и сопоставлять, например, чтобы получить тела всех комментариев:

 # would return all bodies of all comments, that belongs to the `Post.first`
Post.first.comments.pluck(:body)
  

Всегда внимательно читайте сообщения об исключениях.