[英]ActiveRecord::StatementInvalid in ContactController rails & postgresql
I have an error when i try to create/ edit or destroy a contact from my table. 尝试从表中创建/编辑或销毁联系人时出现错误。
When i try to create/ edit i have : 当我尝试创建/编辑时,我有:
ActiveRecord::StatementInvalid in ContactController#create ActiveRecord :: StatementInvalid在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. PG :: UndefinedFunction:错误:函数get_xmlbinary()不存在第1行:SELECT(get_xmlbinary()='base64')^提示:没有函数与给定的名称和参数类型匹配。 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" 查询:SELECT(get_xmlbinary()='base64')上下文:PL / pgSQL函数hc_contact_status()在IF的第3行:INSERT INTO“ contact”(“ lastname”,“ firstname”,“ name”,“ phone”,“ email” “)值($ 1,$ 2,$ 3,$ 4,$ 5)返回“ id”
and when i try to delete: 当我尝试删除时:
ActiveRecord::StatementInvalid in ContactController#create ActiveRecord :: StatementInvalid在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. PG :: UndefinedFunction:错误:函数hstore(contact)不存在第1行:SELECT hstore(OLD。 )- exclude_cols ^提示:没有函数与给定的名称和参数类型匹配。 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 查询:SELECT hstore(OLD。 )- excludes_cols上下文:分配时的PL / pgSQL函数hc_contact_logger()第18行:从“联系人”中删除,在“联系人”中删除。“ id” = $ 1
I followed it guide to add "hstore" to my application_db but it display ERROR: extension "hstore" already exists
我遵循它的指南将“ hstore”添加到我的application_db中,但显示ERROR: extension "hstore" already exists
I'm working on an existing database (Salesforce). 我正在使用现有数据库(Salesforce)。 I get my model controller and views with the command line rails generate scaffold contact
and i can display content of the database on my browser. 我得到了我的模型控制器,并且带有命令行rails generate scaffold contact
视图rails generate scaffold contact
并且可以在浏览器上显示数据库的内容。
contact_controller.rb: 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
What can it be? 会是什么 do not hesitate to ask if you need some other file 不要犹豫,问您是否需要其他文件
EDIT : I found it on PSQL: 编辑 :我在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_logtrigger在salesforce.contact上插入,删除或更新后,针对每行(get_xmlbinary():: text ='base64':: text)执行过程salesforce.hc_contact_logger()
hc_contact_status_trigger BEFORE INSERT OR UPDATE ON salesforce.contact FOR EACH ROW EXECUTE PROCEDURE salesforce.hc_contact_status() hc_contact_status_trigger在对salesforce.contact插入或更新之前,针对每个行执行过程salesforce.hc_contact_status()
schema.rb 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
You need to include "public" schema to your schema_search_path into database.yml 您需要将“公共”模式包括到您的schema_search_path到database.yml中
default: &default
...........
schema_search_path: "salesforce,public"
Connect creates a function called get_xmlbinary
in the public
schema of your database, which it uses as part of the sync process. Connect在数据库的public
模式中创建一个称为get_xmlbinary
的函数,该函数将其用作同步过程的一部分。 If you remove the public
schema from your search_path
, Connect won't be able to find that function, and sync will fail. 如果从search_path
删除public
模式,Connect将无法找到该功能,并且同步将失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.