我有一個PostgreSQL表,YAML資料存盤在一個文本欄位中。
我試圖找到一個鍵被從false改為true的所有實體。
audited_changes: {"hide_on_map"=>[false, true]}。
我可以通過對屬性hide_on_map的類似查詢輕松找到這個鍵的所有實體
[3] pry(main)>/span> like_query = ActiveRecord::Base. send(:sanitize_sql_like, 'hide_on_map')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ? ', "%#{like_query}%").count
(245. 8ms) SELECT COUNT(*) FROM " audits" WHERE "audits". "auditable_type" = $1 AND (audited_changes like '%hide_onmap%') [["auditable_type", "Lot"]]
=> 1710
然而,添加雙引號會破壞這一點
[4] pry(main)>/span> like_query = ActiveRecord::Base. send(:sanitize_sql_like, '"hide_on_map"'/span>)
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%") .count
(238. 5ms) SELECT COUNT(*) FROM "uditits" WHERE "udit". "auditable_type" = $1 AND (audited_changes like '%"hide\_on_map"%'/span>) [["auditable_type", "Lot"]]
=> 0
讓我們來看看完整的查詢
[5] pry(main)>/span> like_query = ActiveRecord::Base. send(:sanitize_sql_like, '"hide_on_map"=> [false, true]')
Audited::Audit.where(auditable_type: 'Lot').where('audited_changes like ?', "%#{like_query}%") .count
(245. 0ms) SELECT COUNT(*) FROM "uditits" WHERE "udit". "auditable_type" = $1 AND (audited_changes like '%"hide\_onmap"=> [false, true]%') [["auditable_type", "Lot"]]
=> 0
開始進入一個轉換為JSONB的兔子洞,但這增加了一些額外的復雜問題,我寧愿不解決。對正確形成的LIKE子句有什么建議嗎?
對于那些提問者,在psql提示符下直接用SQL查詢的兩個例子。
select count(*) from audits where audited_changes like '%"ide_on_map"%'。
select count(*)from audits where audited_changes like '%"hide\_on_map"%'。
兩者的結果都是0。
uj5u.com熱心網友回復:
問題是,在YAML中沒有一種獨特的方式來表達這些資料:
hide_on_map:
- no
- yes
"hide_on_map": [false, true ]
都是你的資料的有效YAML表示。
。我擔心你不能避免使用一些本地型別,或者至少是一個 "壓縮 "的JSON文本(它將包含字面上的'"hide_on_map":[false,true]')。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/322772.html
標籤:
