0

我有一个错误,当我尝试创建/编辑或销毁我的表中的联系人。ActiveRecord :: StatementInvalid在ContactController rails&postgresql

当我尝试创建/编辑我有:

ActiveRecord::StatementInvalid in ContactController#create

PG::UndefinedFunction: ERROR: function get_xmlbinary() does not exist LINE 1: SELECT (get_xmlbinary() = 'base64')^HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT (get_xmlbinary() = 'base64') CONTEXT: PL/pgSQL function hc_contact_status() line 3 at IF : INSERT INTO "contact" ("lastname", "firstname", "name", "phone", "email") VALUES ($1, $2, $3, $4, $5) RETURNING "id"

,当我试图删除:

ActiveRecord::StatementInvalid in ContactController#create

PG::UndefinedFunction: ERROR: function hstore(contact) does not exist LINE 1: SELECT hstore(OLD.) - excluded_cols^HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT hstore(OLD.) - excluded_cols CONTEXT: PL/pgSQL function hc_contact_logger() line 18 at assignment : DELETE FROM "contact" WHERE "contact"."id" = $1

我跟着它guide为“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 AFTER INSERT OR DELETE OR UPDATE ON salesforce.contact FOR EACH ROW WHEN (get_xmlbinary()::text = 'base64'::text) EXECUTE PROCEDURE salesforce.hc_contact_logger()

hc_contact_status_trigger BEFORE INSERT OR UPDATE ON salesforce.contact FOR EACH ROW EXECUTE PROCEDURE 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 
+0

你在'schema.rb'中有什么? –

+0

我解决了它,不幸我真的不知道如何让我忍不住。我发布mu schema.rb,它可以帮助有问题的人 – Tellimi

回答

0

您需要包括 “公共” 模式将您的schema_search_path复制到database.yml中

default: &default 
    ........... 
    schema_search_path: "salesforce,public" 

Conne ct在数据库的public模式中创建一个名为get_xmlbinary的函数,该函数将其用作同步过程的一部分。如果您从search_path中删除public架构,Connect将无法找到该功能,并且同步将失败。

相关问题