フィールドという名前の列を持つレガシーデータベースにテーブルがあります。テーブルを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ではすべてがうまく機能します。ルビーでは、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'
何か手がかりはありますか?私はpostgres9.0とrails3.2.6を使用しています。ありがとう