Визуализация коллекции полей моделей - PullRequest
0 голосов
/ 10 июля 2019

У меня есть отношение AR объектов Post.Каждое сообщение имеет body поле.Мне нужно отобразить коллекцию этих полей через массив сообщений.

старая версия (плохой способ исполнения)

- user.posts.each do |post|
  - if post.body.present?
    = render partial: "application/body", locals: {body: post.body}

Мне нужно что-то вроде этого:

= render partial: "application/body", collection: user.posts, as: :body (but body is posts->post.body)

Как это сделать правильно?

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Поскольку body - это поле сообщения, вы можете выбрать тела сообщений и передать их в коллекцию.Есть полезный метод pluck, он выбирает только указанные поля - он более производительный, чем posts.map(&:body)

= render partial: "application/body", collection: user.posts.pluck(:body), as: :body 
0 голосов
/ 11 июля 2019

Просто совет. При выполнении итерации активного сбора записей лучше использовать find_each вместо каждого: https://medium.com/@jonathanabrams/doing-stuff-with-rails-find-each-3f592ae02136

Переписать его на render .. collection также хороший вариант.

Если вам нужно поместить весь код в одну строку, вы можете написать это:
= render partial: 'application/body', collection: user.posts.where.not(body: [nil, false]), as: :post

Или это:
= render partial: 'application/body', collection: user.posts.where.not(body: [nil, false]).map(&:body), as: :body

Также было бы хорошо поместить условие в область действия в Post.rb:
scope :with_title, -> { where.not(posts: { body: [nil, false] }) }

Итак, окончательная версия кода будет такой:
= render partial: 'application/body', collection: user.posts.with_title.map(&:body), as: :body

Для дальнейшего чтения:
https://thoughtbot.com/blog/activerecord-s-where-not-and-nil
https://www.rubyguides.com/2018/10/ruby-map-method/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...