我正在使用Rails 4.2.3和ruby 2.2.1
我在角色模型中写了一个范围如下:
应用程序/模型/ role.rb
scope :default, -> { find_by(default: true) }
现在我跑
> Role.default
#this is the output I got.
Role Load (0.1ms) SELECT `roles`.* FROM `roles` WHERE `roles`.`default` = 1 LIMIT 1
Role Load (0.1ms) SELECT `roles`.* FROM `roles`
=> []
正如您所看到的,这会触发2个查询并返回错误的结果。
我尝试使用类方法而不是范围
def self.default
self.find_by(default: true)
end
现在我跑
Role.default
#this is the output I got
Role Load (0.2ms) SELECT `roles`.* FROM `roles` WHERE `roles`.`default` = 1 LIMIT 1
=> nil
使用类方法find_by正常工作。
我无法理解我在这里做错了什么。任何帮助,将不胜感激。提前谢谢。
答案 0 :(得分:11)
您不应该在范围内使用find_by
- find_by
实际执行数据库查询。
您应该只使用返回更多范围的方法,例如where
,limit
,order
等。
答案 1 :(得分:3)
ActiveRecord是Rails中内置的对象关系映射系统,它为您提供了一组在范围中用于抽象出数据库查询的方法。这些方法列在这里:
http://guides.rubyonrails.org/active_record_querying.html#retrieving-objects-from-the-database
在您的情况下,您将需要使用where
查询。
scope :default, -> { where(default: true) }