ActiveRecord ::StatementInvalid в ContactController rails и postgresql

#ruby-on-rails #postgresql #activerecord #model-view-controller

#ruby-on-rails #postgresql #activerecord #модель-представление-контроллер

Вопрос:

У меня возникает ошибка при попытке создать / отредактировать или уничтожить контакт из моей таблицы.

Когда я пытаюсь создать / отредактировать, у меня :

ActiveRecord::StatementInvalid в ContactController#создать

PG::Неопределенная функция: ОШИБКА: функция get_xmlbinary() не существует СТРОКА 1: SELECT (get_xmlbinary() = ‘base64’) ^ ПОДСКАЗКА: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явные приведения типов. ЗАПРОС: SELECT (get_xmlbinary() = ‘base64’) КОНТЕКСТ: функция PL / pgSQL hc_contact_status() строка 3 в IF: ВСТАВИТЬ В «контакт» («фамилия», «имя», «имя», «телефон», «электронная почта») ЗНАЧЕНИЯ ($1, $2, $3, $4, $5) ВОЗВРАТ «идентификатора»

и когда я пытаюсь удалить:

ActiveRecord::StatementInvalid в ContactController#создать

PG ::UndefinedFunction: ОШИБКА: функция hstore(контакт) не существует СТРОКА 1: ВЫБЕРИТЕ hstore(СТАРЫЙ.) — excluded_cols ^ ПОДСКАЗКА: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явные приведения типов. ЗАПРОС: ВЫБЕРИТЕ hstore(СТАРЫЙ.) — excluded_cols КОНТЕКСТ: функция PL / pgSQL hc_contact_logger() строка 18 при назначении: УДАЛИТЬ ИЗ «контакта», ГДЕ «контакт».»id» = $ 1

Я следовал этому руководству, чтобы добавить «hstore» в мой application_db, но он отображает ERROR: extension "hstore" already exists

Я работаю над существующей базой данных (Salesforce). Я получаю свой контроллер модели и представления с помощью командной строки rails generate scaffold contact и могу отображать содержимое базы данных в своем браузере.

contact_controller.rb:

 class ContactController < ApplicationController
  before_action :set_contact, only: [:show, :edit, :update, :destroy]

  # GET /contacts
  # GET /contacts.json
  def index
    @contact = Contact.all
  end

  # GET /contacts/1
  # GET /contacts/1.json  
  def show
  end

  # GET /contacts/new
  def new
    @contact = Contact.new
  end

  # GET /contacts/1/edit
  def edit
  end

  # POST /contacts
  # POST /contacts.json
  def create
    @contact = Contact.new(contact_params)

    respond_to do |format|
      if @contact.save
        format.html { redirect_to @contact, notice: 'Contact was successfully created.' }
        format.json { render :show, status: :created, location: @contact }
      else
        format.html { render :new }
        format.json { render json: @contact.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /contacts/1
  # PATCH/PUT /contacts/1.json
  def update
    respond_to do |format|
      if @contact.update(contact_params)
        format.html { redirect_to @contact, notice: 'Contact was successfully updated.' }
        format.json { render :show, status: :ok, location: @contact }
      else
        format.html { render :edit }
        format.json { render json: @contact.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /contacts/1
  # DELETE /contacts/1.json
  def destroy
    @contact.destroy
    respond_to do |format|
      format.html { redirect_to @contact, notice: 'Contact was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
  #contact_url

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_contact
      @contact = Contact.find(params[:id])
    end


    # Never trust parameters from the scary internet, only allow the white list through.
    def contact_params
      params.require(:contact).permit(:name, :lastname, :firstname, :phone, :email)
    end
end
  

Что это может быть? не стесняйтесь спрашивать, нужен ли вам какой-либо другой файл

РЕДАКТИРОВАТЬ: я нашел его в PSQL:

hc_contact_logtrigger ПОСЛЕ ВСТАВКИ, УДАЛЕНИЯ ИЛИ ОБНОВЛЕНИЯ В salesforce.contact ДЛЯ КАЖДОЙ СТРОКИ, КОГДА (get_xmlbinary()::text = ‘base64’::text) ВЫПОЛНЯЕТСЯ ПРОЦЕДУРА salesforce.hc_contact_logger()

hc_contact_status_trigger ПЕРЕД ВСТАВКОЙ ИЛИ ОБНОВЛЕНИЕМ В salesforce.contact ДЛЯ КАЖДОЙ СТРОКИ ВЫПОЛНИТЕ ПРОЦЕДУРУ salesforce.hc_contact_status()

schema.rb

 ActiveRecord::Schema.define(version: 0) do

  enable_extension "plpgsql"
  enable_extension "hstore"

  create_table "_hcmeta", force: :cascade do |t|
    t.string  "org_id",  limit: 50
    t.text    "details"
    t.integer "hcver"
  end

  create_table "_sf_event_log", force: :cascade do |t|
    t.string   "table_name",   limit: 128
    t.string   "action",       limit: 7
    t.datetime "synced_at",                default: -> { "now()" }
    t.datetime "sf_timestamp"
    t.string   "sfid",         limit: 20
    t.text     "record"
    t.boolean  "processed"
    t.index ["sfid"], name: "idx__sf_event_log_sfid", using: :btree
    t.index ["table_name", "synced_at"], name: "idx__sf_event_log_comp_key", using: :btree
  end

  create_table "_trigger_last_id", id: false, force: :cascade do |t|
    t.integer "trigger_log_id"
  end

  create_table "_trigger_log", force: :cascade do |t|
    t.string   "table_name",   limit: 128
    t.string   "state",        limit: 8
    t.string   "sfid",         limit: 18
    t.datetime "processed_at"
    t.string   "action",       limit: 7
    t.datetime "updated_at",               default: -> { "now()" }
    t.text     "old"
    t.bigint   "txid"
    t.integer  "record_id"
    t.text     "sf_message"
    t.datetime "created_at",               default: -> { "now()" }
    t.text     "values"
    t.integer  "sf_result"
    t.bigint   "processed_tx"
    t.index ["created_at"], name: "_trigger_log_idx_created_at", using: :btree
    t.index ["state", "id"], name: "_trigger_log_idx_state_id", using: :btree
    t.index ["state", "table_name"], name: "_trigger_log_idx_state_table_name", where: "(((state)::text = 'NEW'::text) OR ((state)::text = 'PENDING'::text))", using: :btree
  end

  create_table "_trigger_log_archive", id: :integer, force: :cascade do |t|
    t.string   "table_name",   limit: 128
    t.string   "state",        limit: 8
    t.string   "sfid",         limit: 18
    t.datetime "processed_at"
    t.string   "action",       limit: 7
    t.datetime "updated_at"
    t.text     "old"
    t.bigint   "txid"
    t.integer  "record_id"
    t.text     "sf_message"
    t.datetime "created_at"
    t.text     "values"
    t.integer  "sf_result"
    t.bigint   "processed_tx"
    t.index ["created_at"], name: "_trigger_log_archive_idx_created_at", using: :btree
    t.index ["record_id"], name: "_trigger_log_archive_idx_record_id", using: :btree
    t.index ["state", "table_name"], name: "_trigger_log_archive_idx_state_table_name", where: "((state)::text = 'FAILED'::text)", using: :btree
  end

  create_table "contact", force: :cascade do |t|
    t.string   "lastname",       limit: 80
    t.string   "firstname",      limit: 40
    t.string   "_hc_lastop",     limit: 32
    t.datetime "systemmodstamp"
    t.string   "name",           limit: 121
    t.text     "_hc_err"
    t.string   "sfid",           limit: 18
    t.string   "phone",          limit: 40
    t.boolean  "isdeleted"
    t.datetime "createddate"
    t.string   "email",          limit: 80
    t.index ["sfid"], name: "hcu_idx_contact_sfid", unique: true, using: :btree
    t.index ["systemmodstamp"], name: "hc_idx_contact_systemmodstamp", using: :btree
  end

  create_table "product2", force: :cascade do |t|
    t.text     "productimage__c"
    t.datetime "createddate"
    t.datetime "systemmodstamp"
    t.boolean  "isdeleted"
    t.string   "sfid",            limit: 18
    t.string   "name",            limit: 255
    t.string   "family",          limit: 40
    t.string   "_hc_lastop",      limit: 32
    t.string   "description",     limit: 4000
    t.string   "productcode",     limit: 255
    t.text     "_hc_err"
    t.index ["sfid"], name: "hcu_idx_product2_sfid", unique: true, using: :btree
    t.index ["systemmodstamp"], name: "hc_idx_product2_systemmodstamp", using: :btree
  end

end
  

Комментарии:

1. Что у вас есть в вашем schema.rb ?

2. Я решил это, к сожалению, я не знаю, как на самом деле, поэтому я не могу помочь. Я публикую mu schema.rb, это может помочь людям, у которых есть проблема

Ответ №1:

Вам необходимо включить «общедоступную» схему в ваш schema_search_path в database.yml

 default: amp;default
  ...........
  schema_search_path: "salesforce,public"
  

Connect создает функцию, вызываемую get_xmlbinary в public схеме вашей базы данных, которую она использует как часть процесса синхронизации. Если вы удалите public схему из своего search_path , Connect не сможет найти эту функцию, и синхронизация завершится ошибкой.