我正在尝试为我的用户模型设置默认范围。每个用户都有一个名称列。问题是我想通过姓氏的第一个字母订购用户。这将是名字中最后一个单词的开头。例如,用户名可能是“Kevin John Smith”,我想通过Smith订购。我目前有default_scope order('name ASC')
,但这是按名字的第一个字母排序。我如何将其转换为按姓氏的第一个字母排序?谢谢!
答案 0 :(得分:2)
试试这个:
User.select("users.*, SUBSTRING_INDEX(users.name, ' ', -1) AS lastname").limit(10).order('lastname ASC')
SUBSTRING_INDEX是mySQL字符串函数之一。
对于PostgreSQL split_part
应该有效:
User.select("users.*, split_part(users.name, ' ', 3) AS lastname").limit(10).order('lastname ASC')
我不确定,但也尝试使用-1
:
User.select("users.*, split_part(users.name, ' ', -1) AS lastname").limit(10).order('lastname ASC')
因为,后者将确保使用分割后的最后一个字符串,这将涵盖用户只有名字和姓氏的情况。
请务必使用unscoped
,这会返回此课程的范围,而不考虑default_scope
。