渲染模型字段集合

时间:2019-07-10 17:15:12

标签: ruby-on-rails

我有Post对象的AR关系。每个帖子都有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 个答案:

答案 0 :(得分:1)

由于body是帖子的字段,因此您可以选择帖子正文并将其作为收藏传递。有一种有用的pluck方法,它仅选择指定的字段-比posts.map(&:body)

性能更好
= render partial: "application/body", collection: user.posts.pluck(:body), as: :body 

答案 1 :(得分:-1)

只是个小费。迭代活动记录收集时,最好使用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/