Rails Rails Quick Tips - ActiveRecord Ordering

匿名 · 2014年02月25日 · 最后由 ywjno 回复于 2014年02月25日 · 1932 次阅读

来这发一贴,无脑翻译,打发打发时间。 无责任翻译,非直译。 原文在此

正文

事实证明将字符串传入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.

需要 登录 后方可回复, 如果你还没有账号请 注册新账号