Ruby中是否有更优雅的方式条件访问Active Record对象属性?
Ruby代码优化方案
你的代码逻辑没问题,但可以从可读性和简洁性上做优化,这里提供几种思路:
线性条件过滤:把条件判断拆成两步,逻辑更清晰,避免三元运算符的嵌套感
groups = object.groups groups = groups.active if context[:active_only].present? groups.map { |group| { id: group.id, name: group.name } }链式条件调用:用
public_send根据条件调用对应的scope,一行完成群组筛选groups = object.groups.public_send(context[:active_only].present? ? :active : :all) groups.map { |group| { id: group.id, name: group.name } }注:如果
object.groups是ActiveRecord关联,all是默认行为,这么写能保持数据库层面的过滤效率。链式精简写法:用
then方法传递对象,减少中间变量,适合偏好链式风格的场景object.groups.then { |groups| context[:active_only].present? ? groups.active : groups }.map do |group| { id: group.id, name: group.name } end
不管哪种方式,都建议保留原代码中数据库层面过滤的逻辑(active作为scope直接生成SQL条件),避免加载无关数据影响性能。
内容的提问来源于stack exchange,提问作者tdmiller
相关产品推荐
相关产品推荐

