Serialize字段为'nil'但未通过'IS NULL'查询

时间:2013-07-13 12:41:13

标签: ruby-on-rails ruby-on-rails-3

我的Project模型中有一个序列化字段,称为排名。

serialize :rankings

以下是一些结果查询:

@projects = Project.where("rankings IS NULL")         -> 0 results
@projects = Project.where("rankings = ?", "")         -> 0 results
@projects = Project.where("rankings = ?", {})         -> 0 results    
@projects = Project.where("rankings = ?", "{}")       -> 0 results
@projects = Project.where("rankings = ?", {}.to_yaml) -> 0 results

Project.find(275).rankings -> nil

这是一个包含100个nils的表(其中#275是一个)。发生了什么事?

3 个答案:

答案 0 :(得分:3)

这是答案。

要在Rails中使用序列化字段查询nil,您必须执行以下操作:

@projects = Project.where("rankings = ?", nil.to_yaml)

答案 1 :(得分:2)

根据this page,Rails使用YAML序列化事物。玩弄这个表明结果不一定是你所期望的:

irb(main):007:0> require 'yaml'
=> true
irb(main):008:0> nil.to_yaml
=> "--- \n...\n"
irb(main):009:0> {}.to_yaml
=> "--- {}\n"

我不能肯定这是你正在遇到的,但它似乎是一个体面的起点。希望它有所帮助!

PS:我猜测使用where的哈希表单会生成正确的查询:

@projects = Project.where(:rankings => nil)

答案 2 :(得分:2)

在使用Postgres的Rails 4中,Rails似乎为nil的序列化列填充了一个实际的“null”字符串。

也就是说,Rails使该字段显示为nil,但您必须专门查询“null”才能获得正确的结果。

所以在Rails 4下,接受的答案不再适用,但这对我有用:

@projects = Project.where("rankings = 'null'")