Rails技术问询:如何检查分类下所有产品是否均为启用状态?
嘿,作为Rails新手,能想到用map来获取每个产品的状态已经很不错啦!其实有更高效、更符合Rails风格的方法来判断分类下所有产品是否都处于启用状态,下面给你几种方案:
最优方案:利用数据库查询直接判断(性能最好)
这种方法不需要把所有产品加载到内存里,直接让数据库帮我们做判断,效率特别高,尤其是产品数量多的时候:
c = Category.find(1) all_products_enabled = !c.products.where(status: :disabled).exists?
原理很简单:如果分类下不存在禁用状态的产品,那就说明所有产品都是启用的。exists?会生成非常轻量的SQL,只检查是否有符合条件的记录,不会返回完整的产品数据。
简洁但需注意性能的方案:使用all?方法
如果你产品数量不多,也可以用更直观的方式,直接遍历产品判断是否全部启用:
c.products.all?(&:enabled?)
这个方法会逐个调用产品的enabled?方法,只要遇到一个禁用的产品就会立刻停止遍历。不过要注意,它会把所有产品对象加载到内存里,如果分类下产品很多,性能会受影响。
另一种轻量内存方案:用pluck获取状态再判断
如果不想加载完整的产品对象,但又想自己做数组判断,可以用pluck只取出status字段:
c.products.pluck(:status).all?(:enabled)
pluck会返回所有产品的status组成的数组,然后我们检查数组里的元素是否全是:enabled。这种方法比加载完整对象要轻量,但还是不如第一种数据库层面的判断高效。
内容的提问来源于stack exchange,提问作者O'hare
相关产品推荐
相关产品推荐

