Activerecord具有哈希值的位置

时间:2011-05-29 15:02:38

标签: sql ruby-on-rails ruby activerecord

我有一个带有cached_info字段的City模型,该字段是序列化哈希。

{:population=>20000, :more_stuff =>....}

如果我在Activerecord中进行以下查询。

City.where('cached_info[:population] > 300').count

我回来了......

ActiveRecord::StatementInvalid: Mysql2::Error: 
You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near '[:population] > 300)' at line 1: SELECT COUNT(*) FROM `places` WHERE `places`.`type` = 'City' AND (cached_info[:population] > 3)

有人有解决方法吗?

3 个答案:

答案 0 :(得分:6)

除非您在查询中使用LIKE,否则没有简单的方法可以通过ActiveRecord和SQL在序列化哈希中进行查询(但这不能进行><之类的比较)。

根据您的使用案例,您应该重新考虑您的数据模型,并将这些字段规范化为适当的模型/列。

答案 1 :(得分:2)

正如Jits所说,LIKE / ILIKE会起作用,例如:

City.where('cached_info LIKE ?', '%name: Louisiana%')

答案 2 :(得分:1)

如果您正在使用带有JSONB字段的PostgreSQL存储哈希值,您可以在where中下拉到SQL并使用以下内容:

City.where("cast(cached_info ->> 'population' as int) > ?", 300)

->>是Postgres JSONB访问运算符 - check out this article