如何将此jsonb SQL查询转换为活动记录查询?
以下数据显示在my如何将此jsonb SQL查询转换为活动记录查询?,sql,ruby-on-rails,postgresql,activerecord,ruby-on-rails-6,Sql,Ruby On Rails,Postgresql,Activerecord,Ruby On Rails 6,以下数据显示在myColorActiveRecord模型中: 身份证件 彩色物品 1. [{“东西”:“杯子”,“颜色”:“红色”},{“东西”:“汽车”,“颜色”:“蓝色”}] 2. [{“东西”:“其他”,“颜色”:“绿色”},{“东西”:“瓷砖”,“颜色”:“红色”}] 3. [{“东西”:“未知”,“颜色”:“红色”}] 4. [{“东西”:“篮子”,“颜色”:“天鹅绒或红色或紫色”}] 如果使用ActiveRecord,情况不会有多大变化,而且在我看来,如果将查询保留为SQL中的查询,
Color
ActiveRecord模型中:
身份证件
彩色物品
1.
[{“东西”:“杯子”,“颜色”:“红色”},{“东西”:“汽车”,“颜色”:“蓝色”}]
2.
[{“东西”:“其他”,“颜色”:“绿色”},{“东西”:“瓷砖”,“颜色”:“红色”}]
3.
[{“东西”:“未知”,“颜色”:“红色”}]
4.
[{“东西”:“篮子”,“颜色”:“天鹅绒或红色或紫色”}]
如果使用ActiveRecord,情况不会有多大变化,而且在我看来,如果将查询保留为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.*")
请注意,其中(“colorvalue->'color'i类似“%”?%”,value)
将不起作用,因为值
由ORM引用,因此您必须构造“%value%
”并将其用作绑定值:
where("colorvalue->>'color' ILIKE ?", "%#{value}%")
当然,中的
是缺失的拼图!非常感谢,回答很好:-)(尝试在ActiveRecord中这样做的主要原因是为了避免在清除用户输入时出现一些麻烦。我同意您的观点,纯SQL通常更具可读性。)
中的涵盖了许多类似的情况,但遗憾的是它缺少文档。无耻的插件,我写了一个,你可以在这些情况下使用。