Product.all.each do |product|
....
end
这种做法是致命的,切记不要这么做,因为一次读出所有的 product 数据不仅慢,如果特别多,会把内存撑满的。一定要用 find_each 或 find_in_batches 代替 each,中文指南的文档在这里
Product.sell.map(&:name)
SELECT `products`.* FROM `products` WHERE (products.sell = 1)
这样写在数据量大得时候查询会非常慢,并且占用内存会非常多,如果可以替换,我觉得这样的写法更好
Product.sell.pluck(:name)
SELECT `products`.`name` FROM `products` WHERE (products.sell = 1)
不仅查询的快,而且占用内存也会极大的降低。
products = Product.all
product_names = products.pluck(:name)
product_brands = products.pluck(:brand)
直接这样写的话在第一句的时候会直接把所有的 product 查询出来,不仅耗时,而且占用内存。防止预查询的做法是
products = Product.all; false
product_names = products.pluck(:name)
product_brands = products.pluck(:brand)
Product.all.pluck(:brand_id).uniq
后来我用 distinct 来代替了
Product.all.pluck('distinct brand_id')
这样虽说加长了 sql 得运行时间但是减少了返回的数据量以及内存占用。
如果有更好的写法,或者其它比较需要注意的地方,欢迎指导