簡體   English   中英

如何將此 jsonb SQL 查詢轉換為 Active Record 查詢?

[英]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)")

既然您的表和別名已經可以訪問,那么您可以將WHERESELECT子句及其相應的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM