2012-08-13 43 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

相关问题