Ruby on rails jsonb列和联接表上的活动记录请求
我正在尝试对具有jsonb字段和与程序关联的表执行查询:Ruby on rails jsonb列和联接表上的活动记录请求,ruby-on-rails,postgresql,rails-activerecord,jsonb,Ruby On Rails,Postgresql,Rails Activerecord,Jsonb,我正在尝试对具有jsonb字段和与程序关联的表执行查询: create_table "sessions", force: :cascade do |t| t.jsonb "lms_data", default: "{}", null: false t.bigint "program_id" lms_数据字段有一个endDate键,在我的会话模型中,我已经有了一个future_end_日期范围:
create_table "sessions", force: :cascade do |t|
t.jsonb "lms_data", default: "{}", null: false
t.bigint "program_id"
lms_数据字段有一个endDate
键,在我的会话模型中,我已经有了一个future_end_日期范围:
scope :future_end_date, -> { where('(lms_data::jsonb->> ?) > ?', 'endDate', Time.now) }
我知道您想执行以下查询:
- 发回包含
以及lms\U数据的所有会话
future\u end\u日期
- 按
列程序对它们进行分组。标题
- 按
sessions->lms\u data->minstartdate
Session
.future_end_date
.joins(:program)
.group('programs.title')
但这引发了:
ActiveRecord::StatementInvalid - PG::AmbiguousColumn: ERROR: column reference "lms_data" is ambiguous
LINE 1: ...gram_id" WHERE "sessions"."account_id" = $2 AND ((lms_data::...
您能解释一下我为什么会出现这个错误,以及如何执行所需的查询吗?(在我粘贴的错误消息中,有其中的“sessions”。“account\u id”
,因为这是一个多租户应用程序,默认情况下,所有查询的范围都在account-tenant模型上)
---编辑两个模型的模式---
在您使用的两个表中都有
lms\U数据
,会话
和程序
,因此在执行查询时,它不知道哪个列属于哪个表。举个例子:
WITH tmp(id, lms_data) AS (values (1, NULL), (2, NULL)),
tmp2(id, lms_data) AS (values (1, NULL))
SELECT lms_data
FROM tmp t1 INNER JOIN tmp2 t2 ON t1.id = t2.id;
-- ERROR: column reference "lms_data" is ambiguous
-- LINE 1: ..., tmp2(id, lms_data) as (values (1, NULL)) select lms_data f...
两个表都有相同的lms_data
列,JOIN
工作正常,但是SELECT
语句抛出的错误与您现在得到的错误相同
可以为表名添加前缀,以避免出现以下情况:
scope :future_end_date, -> { where('(sessions.lms_data::jsonb->> ?) > ?', 'endDate', Time.now) }
请注意,您可以使用CURRENT\u TIMESTAMP
函数,而不是在作用域中绑定常量值(Time.now
):
(sessions.lms_data::jsonb->> ?) > CURRENT_TIMESTAMP
你能为这两个模型共享模式吗?@Joel_Blum yes将doI am now get
PG::GroupingError:ERROR:列“sessions.id”必须出现在GROUP BY子句中或用于聚合函数行1:选择“sessions”。“id”作为t0_r0,“sessions”。“lms_数据”作为t0.
有什么想法吗?这是因为这里有group by子句group('programs.title')
,您必须根据需要调整查询。
(sessions.lms_data::jsonb->> ?) > CURRENT_TIMESTAMP