From dfb93ef58f1e96448900575ae407685e23963105 Mon Sep 17 00:00:00 2001 From: aakashb95 Date: Mon, 13 Jul 2026 18:32:19 +0530 Subject: [PATCH] fix(captain): scope FAQ observations to account --- .../20260710000000_create_captain_faq_suggestions.rb | 5 +++-- db/schema.rb | 4 +++- enterprise/app/models/captain/faq_observation.rb | 10 ++++++++++ enterprise/app/models/enterprise/concerns/account.rb | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/db/migrate/20260710000000_create_captain_faq_suggestions.rb b/db/migrate/20260710000000_create_captain_faq_suggestions.rb index 1eced91c4..6bc03f387 100644 --- a/db/migrate/20260710000000_create_captain_faq_suggestions.rb +++ b/db/migrate/20260710000000_create_captain_faq_suggestions.rb @@ -20,8 +20,8 @@ class CreateCaptainFaqSuggestions < ActiveRecord::Migration[7.1] t.timestamps end - add_index :captain_faq_suggestions, [:assistant_id, :status, :language], - name: 'idx_captain_faq_suggestions_on_assistant_status_language' + add_index :captain_faq_suggestions, [:account_id, :assistant_id, :status, :language], + name: 'idx_cap_faq_suggestions_on_account_assistant_status_language' add_index :captain_faq_suggestions, :embedding, using: :ivfflat, name: 'vector_idx_captain_faq_suggestions_embedding', opclass: :vector_cosine_ops @@ -29,6 +29,7 @@ class CreateCaptainFaqSuggestions < ActiveRecord::Migration[7.1] def create_faq_observations create_table :captain_faq_observations do |t| + t.references :account, null: false, index: true t.references :conversation, null: false, index: true t.references :faq_suggestion, index: true t.string :generated_question, null: false diff --git a/db/schema.rb b/db/schema.rb index f952e66b2..2deddcd31 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -393,6 +393,7 @@ ActiveRecord::Schema[7.1].define(version: 2026_07_10_000000) do end create_table "captain_faq_observations", force: :cascade do |t| + t.bigint "account_id", null: false t.bigint "conversation_id", null: false t.bigint "faq_suggestion_id" t.string "generated_question", null: false @@ -401,6 +402,7 @@ ActiveRecord::Schema[7.1].define(version: 2026_07_10_000000) do t.integer "status", default: 0, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.index ["account_id"], name: "index_captain_faq_observations_on_account_id" t.index ["conversation_id", "faq_suggestion_id"], name: "idx_captain_faq_observations_on_conversation_and_suggestion", unique: true, where: "(faq_suggestion_id IS NOT NULL)" t.index ["conversation_id"], name: "index_captain_faq_observations_on_conversation_id" t.index ["faq_suggestion_id"], name: "index_captain_faq_observations_on_faq_suggestion_id" @@ -418,7 +420,7 @@ ActiveRecord::Schema[7.1].define(version: 2026_07_10_000000) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["account_id"], name: "index_captain_faq_suggestions_on_account_id" - t.index ["assistant_id", "status", "language"], name: "idx_captain_faq_suggestions_on_assistant_status_language" + t.index ["account_id", "assistant_id", "status", "language"], name: "idx_cap_faq_suggestions_on_account_assistant_status_language" t.index ["assistant_id"], name: "index_captain_faq_suggestions_on_assistant_id" t.index ["embedding"], name: "vector_idx_captain_faq_suggestions_embedding", opclass: :vector_cosine_ops, using: :ivfflat end diff --git a/enterprise/app/models/captain/faq_observation.rb b/enterprise/app/models/captain/faq_observation.rb index 31ee7ae53..1272b2a48 100644 --- a/enterprise/app/models/captain/faq_observation.rb +++ b/enterprise/app/models/captain/faq_observation.rb @@ -9,12 +9,14 @@ # status :integer default("attached"), not null # created_at :datetime not null # updated_at :datetime not null +# account_id :bigint not null # conversation_id :bigint not null # faq_suggestion_id :bigint # class Captain::FaqObservation < ApplicationRecord self.table_name = 'captain_faq_observations' + belongs_to :account belongs_to :conversation, class_name: '::Conversation' belongs_to :faq_suggestion, class_name: 'Captain::FaqSuggestion', optional: true, inverse_of: :observations @@ -22,4 +24,12 @@ class Captain::FaqObservation < ApplicationRecord validates :generated_question, :generated_answer, :language, presence: true validates :faq_suggestion, presence: true, if: :attached? + + before_validation :ensure_account + + private + + def ensure_account + self.account = conversation&.account + end end diff --git a/enterprise/app/models/enterprise/concerns/account.rb b/enterprise/app/models/enterprise/concerns/account.rb index 718c8d707..8fcf57b37 100644 --- a/enterprise/app/models/enterprise/concerns/account.rb +++ b/enterprise/app/models/enterprise/concerns/account.rb @@ -11,6 +11,7 @@ module Enterprise::Concerns::Account has_many :captain_assistants, dependent: :destroy_async, class_name: 'Captain::Assistant' has_many :captain_assistant_responses, dependent: :destroy_async, class_name: 'Captain::AssistantResponse' + has_many :captain_faq_observations, dependent: :destroy_async, class_name: 'Captain::FaqObservation' has_many :captain_faq_suggestions, dependent: :destroy_async, class_name: 'Captain::FaqSuggestion' has_many :captain_documents, dependent: :destroy_async, class_name: 'Captain::Document' has_many :captain_custom_tools, dependent: :destroy_async, class_name: 'Captain::CustomTool'