关于范围的Ruby on Rails问题

fel*_*lix 0 ruby scope named-scope ruby-on-rails ruby-on-rails-3

我的模型中有以下命名范围

class User
  scope :single_action, where("parent_id = ?", nil)
end
Run Code Online (Sandbox Code Playgroud)

尽管存在带有nil值的parent_id的记录,但它们似乎不可用.

ruby-1.9.2-p0 > User.select("name")
 => [#<User parent_id: nil, name: "John">, #<Task parent_id: 1, name: "Felix">, #<Task parent_id: nil, name: "John Felix">]
Run Code Online (Sandbox Code Playgroud)

我尝试使用活动记录查询来执行相同操作,但它也返回空结果集

ruby-1.9.2-p0 > User.where("parent_id = ?",nil)
 => []
Run Code Online (Sandbox Code Playgroud)

我已经定义了一些似乎工作正常的其他范围.我的Rails版本是3.0.7,Ruby版本是Ruby 1.9.2你可以帮我解决这个问题.

谢谢 :)

Spy*_*ros 5

改为:

User.where(:parent_id => nil)
Run Code Online (Sandbox Code Playgroud)

您可以看到差异(您实际上尝试匹配字符串'NULL'而不是检查值为NULL):

ruby-1.9.2-p180 :031 > User.where("remember_token = ?", nil)
 => [] 
ruby-1.9.2-p180 :032 > User.where(:remember_token => nil)
 => [#<User id: 232255501, .......

ruby-1.9.2-p180 :029 > User.where(:remember_token => nil).to_sql
 => "SELECT `users`.* FROM `users` WHERE (`users`.`remember_token` IS NULL)" 
ruby-1.9.2-p180 :030 > User.where("remember_token = ?", nil).to_sql
 => "SELECT `users`.* FROM `users` WHERE (remember_token = NULL)
Run Code Online (Sandbox Code Playgroud)