Activerecord Где со значением хеша - PullRequest
4 голосов
/ 29 мая 2011

У меня есть модель City с полем cached_info, которое является сериализованным хэшем.

{: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 ]

6 голосов
/ 29 мая 2011

Нет простого способа выполнить запрос в сериализованном хеше через ActiveRecord и SQL, если только вы не используете LIKE в своем запросе (но это не может сделать сравнения, такие как > и <).

Исходя из вашего варианта использования, вы должны действительно переосмыслить свою модель данных и нормализовать эти поля в соответствующие модели / столбцы.

2 голосов
/ 07 ноября 2012

Как сказал Джитс, LIKE / ILIKE будет работать, например ::10000

City.where('cached_info LIKE ?', '%name: Louisiana%')
1 голос
/ 02 апреля 2018

Если вы используете PostgreSQL с полями JSONB для хранения ваших хэшей, вы можете перейти к SQL в where и использовать что-то вроде этого:

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

->> является оператором доступа Postgres JSONB - ознакомьтесь с этой статьей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...