我的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是一个)。发生了什么事?
答案 0 :(得分:3)
这是答案。
@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'")