我正在通过观看 RailsCast视频了解匿名范围。当我自己尝试时,它似乎是这样的声明:
scope = User.scoped
立即使用 SQL 语句查询数据库:
User Load (3.2ms) SELECT `users`.* FROM `users`
在我什至有机会连锁条件之前。这显然是非常低效的,并且在视频中的作者这样做时不会发生。我错过了什么?
此外,范围在什么时候知道我已经完成了链接条件并且是时候执行查询了?
我正在通过观看 RailsCast视频了解匿名范围。当我自己尝试时,它似乎是这样的声明:
scope = User.scoped
立即使用 SQL 语句查询数据库:
User Load (3.2ms) SELECT `users`.* FROM `users`
在我什至有机会连锁条件之前。这显然是非常低效的,并且在视频中的作者这样做时不会发生。我错过了什么?
此外,范围在什么时候知道我已经完成了链接条件并且是时候执行查询了?
您是否在控制台中尝试此操作?问题是,如果您键入:
scope = User.scoped
console
尝试检查最后一条语句并触发查询。为避免这种情况,只需在最后返回一些内容:
scope = User.scoped; nil
通过这种方式进行console
检查nil
,您的scope
变量不会发生任何事情。这在实际代码中不会成为问题,因为在您定义它之后没有人会立即尝试检查它。
我不想让您气馁,但可以肯定的是,在 Rails 4 中该方法scoped
即将被弃用。这个 RailsCast讨论了新版本的更多有趣的新特性。