Ruby on rails 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_日期范围:

我正在尝试对具有jsonb字段和与程序关联的表执行查询:

  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