4

我的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 个 nil 的表(其中 #275 是一个)。这是怎么回事?

4

3 回答 3

3

这是答案。

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

@projects = Project.where("rankings = ?", nil.to_yaml)
于 2013-07-17T04:02:12.957 回答
2

根据这个页面,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)
于 2013-07-15T08:56:04.520 回答
2

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

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

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

@projects = Project.where("rankings = 'null'")
于 2014-09-25T00:08:25.647 回答