【发布时间】:2021-07-30 23:21:55
【问题描述】:
我正在尝试对带有 jsonb 字段并与程序关联的表执行查询:
create_table "sessions", force: :cascade do |t|
t.jsonb "lms_data", default: "{}", null: false
t.bigint "program_id"
lms_data 字段有一个 endDate 键,在我的会话模型中我已经有一个 future_end_date 范围:
scope :future_end_date, -> { where('(lms_data::jsonb->> ?) > ?', 'endDate', Time.now) }
我知道要执行以下查询:
- 用
lms_data和future_end_date发回所有会话 - 按
programs.title列分组 - 通过
sessions -> lms_data -> min startDate订购它们
我试过了:
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::...
您能否解释一下为什么会出现此错误以及如何执行所需的查询? (在我粘贴的错误消息中有WHERE "sessions"."account_id",因为这是一个多租户应用程序,所有查询默认情况下都在帐户租户模型范围内)
--- 编辑两种模型的模式 ---
Session :
create_table "sessions", force: :cascade do |t|
t.jsonb "lms_data", default: "{}", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.bigint "program_id"
t.bigint "account_id"
t.index ["account_id"], name: "index_sessions_on_account_id"
t.index ["lms_data"], name: "index_sessions_on_lms_data", using: :gin
t.index ["program_id"], name: "index_sessions_on_program_id"
end
create_table "programs", force: :cascade do |t|
t.string "title"
t.string "headline"
t.text "description"
t.integer "duration_in_hours"
t.bigint "category_id"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.boolean "featured"
t.jsonb "lms_data", default: "{}", null: false
t.bigint "author_id"
t.string "dpc_number"
t.integer "position"
t.text "goals"
t.string "publication_status", default: "draft"
t.date "upcoming_date"
t.string "session_subscription_mode", default: "sliding"
t.integer "program_recommandation_id"
t.bigint "account_id"
t.index ["account_id"], name: "index_programs_on_account_id"
t.index ["author_id"], name: "index_programs_on_author_id"
t.index ["category_id"], name: "index_programs_on_category_id"
t.index ["lms_data"], name: "index_programs_on_lms_data", using: :gin
t.index ["program_recommandation_id"], name: "index_programs_on_program_recommandation_id"
end
【问题讨论】:
-
你能分享两个模型的架构吗?
-
@Joel_Blum 是的会做
标签: ruby-on-rails postgresql rails-activerecord jsonb