我在遗留数据库中有一个表,其中有一个名为field的列。 将表直接链接到activeRecord模型是不可能的,因为后者会尝试创建方法field_changed?这已经定义了。
所以我创建了一个视图来重命名字段并创建了以下规则以允许插入,更新和删除。
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。 感谢
答案 0 :(得分:4)
首先,如果您能够更新到PostgreSQL 9.1,view triggers比规则更容易正确。
其次,DEALLOCATE
来自哪里?它是否试图释放准备好的声明?
尝试在log_statement = 'all'
中启用postgresql.conf
,重新加载PostgreSQL(pg_ctl reload
,SIGHUP
邮件管理员,或重新启动它,重新运行测试并检查Pg的日志。查看您的Rails程序实际运行的SQL。