我在舊數據庫中有一個表,其中有一個名爲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。 謝謝
謝謝你克雷格。 Postgresql對這個問題給出了明確的解釋。錯誤:無法執行INSERT RETURNING關係「new_linked_fields」 提示:您需要使用RETURNING子句的無條件ON INSERT DO INSTEAD規則。 – jlfenaux 2012-08-13 14:44:39
規則正在:創建或替換規則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
你知道我是否還必須添加返回值來刪除和更新規則?一切似乎都工作到目前爲止。 – jlfenaux 2012-08-13 14:47:13