#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)
Всегда внимательно читайте сообщения об исключениях.