Rails 请教 scope 的问题

benyu · 2014年07月30日 · 最后由 tumayun 回复于 2014年07月31日 · 2001 次阅读

定义了一个 Catalog 的 Model 其中有个

scope :about, ->{find_by(slug: 'about')}

为什么执行出来的结果是不确定的,即有时候执行一条 SQL,有时候执行二条 SQL(在 console 中看到这样情况):

2.0.0-p0 :010 > Catalog.about
  Catalog Load (0.3ms)  SELECT `catalogs`.* FROM `catalogs` WHERE `catalogs`.`slug` = 'about' ORDER BY `catalogs`.`id` ASC LIMIT 1
  Catalog Load (0.2ms)  SELECT `catalogs`.* FROM `catalogs`

结果是返回全部的 catalog 内容,如果我直接在 console 运行

.0.0-p0 :007 > Catalog.find_by(slug: 'abount')
  Catalog Load (0.4ms)  SELECT `catalogs`.* FROM `catalogs` WHERE `catalogs`.`slug` = 'abount' LIMIT 1
 => nil

这是什么情况?谢谢

Catalog.find_by(slug: 'abount') 这里字符串打错了!!! abount??????????

好吧,是打错了,但是也不应该执行二条 SQL 吧?应该是找不到相应的记录才对,是不是? 谢谢!

scope 执行结果为 nil 的话会返回所有的值,使用时得注意

@dddd1919 Really? 不会吧!!!

scope 里面可能 not found 的话是危险的,这种写成方法就好了,为嘛用 scope. 返回 all 是不是为了 scope 的衔接?比如 Post.scope1.scope2.scope3?

@saiga 这算 bug 了吧。为了链式调 用也不能返回 all 啊,应该 none 才对呀. 赶紧提 pull request. 还有,我觉得这种返回 1 个对象的查询,就不要用 scope 了,定义 method 吧。

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