ActiveRecordとSequelでビューのモデルを作ってみる実験
ちょっと気になってやってみたら普通にできました。
環境
ActiveRecord | 2.3.5 |
Sequel | 3.8.0 |
ruby | 1.8.7 (2008-08-11 patchlevel 72) |
sqlite3 | 3.6.12 |
実験データ
$ sqlite3 test.sqlite3
sqlite> create table groups (id integer, name string);
sqlite> create table members (id integer, group_id, name string);
sqlite> select g.id, m.id as member_id, g.name, m.name from groups g, members m where g.id = m.group_id;
sqlite> insert into groups (id, name) values (1, 'group1');
sqlite> insert into groups (id, name) values (2, 'group2');
sqlite> insert into members (id, group_id, name) values (1, 1, 'aaa');
sqlite> insert into members (id, group_id, name) values (2, 1, 'bbb');
sqlite> insert into members (id, group_id, name) values (3, 2, 'ccc');
sqlite> create view v_groups as select g.id, m.id as member_id, g.name, m.name from groups g, members m where g.id = m.group_id;sqlite> select * from v_groups;
1|1|group1|aaa
1|2|group1|bbb
2|3|group2|ccc
sqlite>
ActiveRecordの場合
ar_view_test.rb
require 'rubygems' require 'active_record' require 'pp' ActiveRecord::Base.establish_connection( :adapter => "sqlite3", :database => "test.sqlite3" ) class VGroup < ActiveRecord::Base end pp VGroup.find(:all) begin VGroup.new.save! rescue puts '書き込みはできない!?' end
v_groups ビューの全件読み出しと、書き込み。
find :all は通常のテーブルのモデルと同様に成功する。
$ ruby ar_view_test.rb
[#,
#,
#]
書き込みはできない!?
当然書き込みはできない。
Sequelの場合
sequel_view_test.rb
require 'rubygems' require 'sequel' require 'pp' Sequel.sqlite("test.sqlite3") class VGroup < Sequel::Model end pp VGroup.all begin VGroup.new.save! rescue puts '書き込みはできない!?' end
やってることは同じ
実行してみる。
同じ結果。
$ ruby sequel_view_test.rb
[#1, :name=>"group1", :id=>1, :"name:1"=>"aaa"}>,
#2, :name=>"group1", :id=>1, :"name:1"=>"bbb"}>,
#3, :name=>"group2", :id=>2, :"name:1"=>"ccc"}>]
書き込みはできない!?
まとめ
思った通りできました。
すばらしい。