Rails如何首先用范围替换Relation#first?

时间:2015-04-30 09:57:35

标签: ruby-on-rails ruby ruby-on-rails-4

我已将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

如何用范围替换它? ......

2 个答案:

答案 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])