我有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)
如何正确处理?
答案 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/