2012-08-13 29 views
2

我在舊數據庫中有一個表,其中有一個名爲field的列。 不可能將表直接鏈接到activeRecord模型,因爲後者將嘗試創建方法field_changed?這已經定義。我無法使用視圖在舊錶中保存activeRecord對象

因此,我創建了一個視圖來重命名該字段並創建了以下規則以允許插入,更新和刪除。

create or replace rule new_linked_fields_upd as on update to new_linked_fields 
    do instead 
    update linked_fields set race_id = new.race_id , master_id = new.master_id, field = new.field_name 
    where id = new.id; 

create or replace rule new_linked_fields_ins as on insert to new_linked_fields 
    do instead 
    insert into linked_fields select nextval('linked_fields_id_seq'), new.race_id, new.field_name, new.master_id; 

create or replace rule new_linked_fields_del as on delete to new_linked_fields 
    do instead 
     delete from linked_fields where id = old.id; 

我將activeRecord模型鏈接到視圖。

class LinkedField < ActiveRecord::Base 
    self.table_name ="new_linked_fields" 
    self.primary_key = "id" 
end 

我不得不添加self.primary_key = 「ID」,否則,如LinkedField.last方法會失敗(產生不良的SQL)。

在SQL中,一切都很好。 在ruby中,我可以更新LinkedField的屬性,或銷燬一個實例,但我無法創建一個。

LinkedField.create(field_name:'toto',race_id:-3,master_id:4) 

返回以下錯誤。

(0.3ms) BEGIN 
    SQL (1.0ms) INSERT INTO "new_linked_fields" ("field_name", "master_id", "race_id") VALUES ($1, $2, $3) RETURNING "id" [["field_name", "toto"], ["master_id", 4], ["race_id", -3]] 
    (0.3ms) ROLLBACK 
ActiveRecord::StatementInvalid: PG::Error: ERROR: syntax error at end of input 
LINE 1: DEALLOCATE 
       ^
: INSERT INTO "new_linked_fields" ("field_name", "master_id", "race_id") VALUES ($1, $2, $3) RETURNING "id" 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:297:in `exec' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:297:in `dealloc' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:287:in `delete' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:1172:in `rescue in exec_cache' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:1155:in `exec_cache' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:665:in `block in exec_query' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.6/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:663:in `exec_query' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/abstract/database_statements.rb:63:in `exec_insert' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/abstract/database_statements.rb:90:in `insert' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `insert' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/relation.rb:66:in `insert' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/persistence.rb:363:in `create' 
    from /Users/macbook/.rvm/gems/ruby-1.9.3-p125/gems/activerecord-3.2.6/lib/active_record/timestamp.rb:57:in `create' 

任何提示?我使用的是postgres 9.0和rails 3.2.6。 謝謝

回答

4

首先,如果你能夠更新到PostgreSQL 9.1,view triggers比規則更容易獲得。

二,DEALLOCATE來自哪裏?它是否試圖釋放準備好的聲明?

嘗試在postgresql.conf使log_statement = 'all',重裝的PostgreSQL(pg_ctl reloadSIGHUP郵政局長,或重新啓動),重新運行測試並檢查PG的日誌。查看您的Rails程序實際運行的是什麼SQL。

+0

謝謝你克雷格。 Postgresql對這個問題給出了明確的解釋。錯誤:無法執行INSERT RETURNING關係「new_linked_fields」 提示:您需要使用RETURNING子句的無條件ON INSERT DO INSTEAD規則。 – jlfenaux 2012-08-13 14:44:39

+0

規則正在:創建或替換規則new_linked_fields_ins作爲插入到new_linked_fields 做,而不是 插入到linked_fields選擇NEXTVAL( 'linked_fields_id_seq'),new.race_id,new.field_name,new.master_id RETURNING linked_fields *; – jlfenaux 2012-08-13 14:46:20

+0

你知道我是否還必須添加返回值來刪除和更新規則?一切似乎都工作到目前爲止。 – jlfenaux 2012-08-13 14:47:13

相關問題