我已将Rails 3.2.12升级到Rails 4.0.0,现在我正在修复所有弃用警告。
其中一个是:
DEPRECATION WARNING: Relation#first with finder options is deprecated. Please build a scope and then call #first on it instead.
代码如下所示:
def current_user
@current_user ||= User.first :conditions => ["id = ?", session[:user_id]]
end
如何用范围替换它? ......
答案 0 :(得分:2)
作为一般指针,不建议使用条件语法,而是使用where。
但是在你的情况下看起来好像你在查询主键,所以你可以简单地使用find:
def current_user
@current_user ||= User.find(session[:user_id])
end
如果您想更改其他一些查询,例如:
@users = User.find(:all, :conditions => ["active = ?", true])
这将改为
@users = User.where(:active => true)
或红宝石1.9
@users = User.where(active: true)
更全面地回答有关范围的问题。您可以在模型上定义范围,例如查找所有活动用户:
class User< ActiveRecord::Base
scope :active, -> { where(active: true) }
end
然后你可以致电User.active
。您还可以将参数传递到范围以作为概念证明,您可以执行以下操作以按给定ID查找活动用户:
class User< ActiveRecord::Base
scope :active_by_id, ->(id) { active.find(id) }
end
然后拨打User.active_by_id(session[:user_id])
详细了解Active Record Scopes:http://guides.rubyonrails.org/active_record_querying.html#scopes
答案 1 :(得分:1)
User.where(id: session[:user_id]).first
如果id是主键,则只能使用
User.find_by(id: session[:user_id])