Phoenix LiveView数据渲染基础排序:按名称排序实现困惑
在Phoenix中对TestBed数据按name排序的两种方案
方案一:数据库层面排序(推荐,性能更优)
直接在Repo查询时通过Ecto Query指定排序规则,数据库返回的结果就是已经排好序的Ecto结构体列表,不需要额外处理:
# 在LiveView的mount/handle_params/handle_event等回调中执行查询 query = from tb in TestBed, order_by: [asc: tb.name] sorted_test_beds = Repo.all(query)
如果需要降序排序,把asc改成desc即可:
query = from tb in TestBed, order_by: [desc: tb.name]
方案二:LiveView视图层内存排序
如果已经从Repo获取了未排序的TestBed结构体列表,可以直接用Enum.sort/2处理,不需要移除__meta__字段或转成普通Map,正确写法如下:
写法一:使用匿名函数
sorted_test_beds = Enum.sort(test_beds, fn a, b -> String.compare(a.name, b.name) == :lt end)
写法二:使用简洁的&操作符
sorted_test_beds = Enum.sort(test_beds, &(&1.name <= &2.name))
如果是字符串类型的name字段,String.compare/2能更严谨处理大小写和特殊字符排序;如果是数字类型,直接用<=比较即可。
注意:数据量较大时优先用数据库排序,避免内存中处理大量数据导致性能下降。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

