[英]How to translate this jsonb SQL query to an Active Record query?
以下數據出現在我的Color
ActiveRecord model 中:
ID | 有色的東西 |
---|---|
1 | [{"thing": "cup", "color": "red"}, {"thing": "car", "color": "blue"}] |
2 | [{"thing": "other", "color": "green"}, {"thing": "tile", "color": "reddish"}] |
3 | [{"thing": "unknown", "color": "red"}] |
4 | [{"thing": "basket", "color": "velvet or red or purple"}] |
coloured_things 列定義為colored_things
。
我正在嘗試搜索所有"color"
鍵以獲取類似於某個搜索詞的值。 這個 SQL 查詢(參見SQL Fiddle )這樣做:
SELECT DISTINCT C.*
FROM colors AS C,
jsonb_array_elements(colored_things) AS colorvalues(colorvalue)
WHERE colorvalue->>'color' ILIKE '%pur%';
現在我很想將此查詢轉換為正確的 Active Record 查詢,但以下內容不起作用:
Color.joins(jsonb_array_elements(colored_things) AS colorvalues(colorvalue))
.where("colorvalue->>'color' ILIKE '%?%'", some_search_term)
.distinct
這給了我錯誤
ActiveRecord::StatementInvalid(PG::UndefinedTable:錯誤:對表“顏色”的 FROM 子句條目的引用無效)
有人可以指出我正確的方向嗎?
如果您使用 ActiveRecord,事情並沒有太大變化,而 IMO 如果您將查詢保留在 SQL 中,它仍然更具可讀性。
為了使其工作,您可以使用from
,並傳遞您當前擁有的原始FROM
子句:
from("colors AS c, JSONB_ARRAY_ELEMENTS(colored_things) AS colorvalues(colorvalue)")
既然您的表和別名已經可以訪問,那么您可以將WHERE
和SELECT
子句及其相應的 AR 方法鏈接起來:
Color
.from("colors AS c, JSONB_ARRAY_ELEMENTS(colored_things) AS colorvalues(colorvalue)")
.where("colorvalue->>'color' ILIKE '%pur%'")
.select("DISTINCT c.*")
請注意where("colorvalue->>'color' ILIKE '%?%'", value)
將不起作用,因為 ORM 引用了value
,因此您必須構造“ %value%
”並將其用作邊界價值:
where("colorvalue->>'color' ILIKE ?", "%#{value}%")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.