来这发一贴,无脑翻译,打发打发时间。 无责任翻译,非直译。 原文在此
事实证明将字符串传入ActiveRecord
查询函数有点稍欠妥当。具体请参阅...(作者忘了原地址),无论如何,这都对你有益。
ActiveRecord
的排序功能大家都烂熟于心。依据上文,你,我可爱的亲爱的深爱的机智的小伙伴,可以善意的问我这个 Rails 新手提出那些深刻的隽永的刻骨铭心的永世难忘的建议?
在此,谢谢你的建议。
然后,为什么这样同样欠妥当呢?
为了省事,先简单复习一下。
理所当然的,ActiveRecord 允许我们传递参数来定义排序方式。
Asshole.order('name asc')
尽管你可以随意传人字符串或者符号,但在此我斗胆说一句,符号才是王道。
这是为什么呢?亲,你注意到两种方式生成的 SQL 语句的差异了吗?
当传入字符串时:
Asshole.order('name asc').to_sql
=> SELECT "assholes".* from "assholes" ORDER by name asc
当传入符号时:
Asshole.order(:name).to_sql
=> SELECT "assholes".* FROM 'assholes' ORDER by "assholes"."name" ASC
亲,看到差别了吗?当传入符号时,查询语句将会更精确。当然绝大多数时候,两者都可以正确执行,但却不可忽视。当你尝试链接查询两个有相同属性名的数据表时,因为属性名未精确指定,使用字符串可能事与愿违。
使用符号时,默认的是升序,如何指定降序? 学院派的做法是:
Asshole.order(Asshole.arel_table[:name].desc).to_sql
=> SELECT "assholes".* FROM "assholes" ORDER BY "assholes"."name" DESC
okay,任务完成。但只要重新扫视一下代码。复杂,灾难。好在 ActiveRecord 提供了一些内在强大功能?
Asshole.order(name: :desc).to_sql
=> SELECT "assholes".* FROM "assholes" ORDER BY "assholes"."name" DESC
这个功能貌似从ActiveRecord
4.0.0 引进。
See, so easy.