rails:2241
From: 須藤 友慈 <sudo@w...>
Date: Sat, 23 Jun 2007 00:27:44 +0900
Subject: [rails:2241] Re: 履歴を考慮した多対多のアソシエーション
(株)WEB2.0の須藤です。 論理削除に関しては、acts_as_paranoidっていうプラグインがあります。 http://ar-paranoid.rubyforge.org/ # IEだと見られないかもしれない destroyでdeleted_atに日付が入り、 findで論理削除されたデータはselectされなくなります。 find_with_deletedで論理削除されたデータもselect対象になります。 使い方は、modelにacts_as_paranoidを記述するだけです。 On Fri, 22 Jun 2007 20:35:27 +0900 "Information Kanasansoft" <kanasansoft@g...> wrote: > kanasanです。 > 初めて質問します。 > > 現在、多対多のアソシエーションを持つ > DBの設計を行っています。 > 結合テーブル(ブリッジテーブル)を > 使用しようとしているのですが > 次の問題が発生し行き詰ってしまいました。 > > 当システムはデータウェアハウス的な > 利用を想定している為、 > 全データに対して履歴を持たなくてはなりません。 > しかし、RoRを利用しつつ > ブリッジテーブルを使用しながら > 履歴を管理する方法を > 見つけ出すことができませんでした。 > > 以下、(大学の)クラブと学生を例にします。 > (業務上の理由で > 実例を挙げられないことをお断りします。 > 例は全てML投稿用に書き下ろしました。) > > 履歴を残さないのであれば > 次のsqlとコードで十分です。 > > ここから======================================== > ER図 > club > ┃[n] > ┃[1] > club_student > ┃[1] > ┃[n] > student > ---------------------------------------- > SQL > create table clubs ( > id int not null auto_increment, > name varchar(255) not null, > ...(略)... > primary key (id) > ); > create table students ( > id int not null auto_increment, > name varchar(255) not null, > ...(略)... > primary key (id) > ); > create table clubs_students ( > club_id int not null, > student_id int not null, > ...(略)... > constraint fk_club > foreign key (club_id) references clubs(id), > constraint fk_student > foreign key (student_id) references students(id), > primary key (club_id, student_id) > ); > ---------------------------------------- > RoR > class Club < ActiveRecode::Base > has_and_belongs_to_many :students > ...(略)... > end > class Student < ActiveRecode::Base > has_and_belongs_to_many :clubs > ...(略)... > end > ここまで======================================== > > 上記の構造に履歴機能を持たせる為に > 次のように変更しました。 > ・各テーブルが履歴を持てるように > 全ての情報を表出しし > テーブル「〜_information」として定義 > ・テーブル「〜_information」と元テーブルをFKで接続 > ・履歴の有効期限(範囲)を管理する為に > 作成日時・削除日時カラムを追加 > ・テーブルにあわせクラス「〜_information」を定義 > ・クラス「〜_information」と > 元のクラスのアソシエーションの宣言を追加 > > ここから======================================== > ER図 > club_information > ┃[n] > ┃[1] > club > ┃[n] > ┃[1] > ┃ [1][n] > club_student━━━club_student_information > ┃[1] > ┃[n] > student > ┃[1] > ┃[n] > student_information > ---------------------------------------- > SQL > create table clubs ( > id int not null auto_increment, > primary key (id) > ); > create table club_information ( > id int not null auto_increment, > club_id int not null, > name varchar(255) not null, > ...(略)... > create_at datetime null, > delete_at datetime null, > constraint fk_club_information > foreign key (club_id) references clubs(id), > primary key (id) > ); > create table students ( > id int not null auto_increment, > primary key (id) > ); > create table student_information ( > id int not null auto_increment, > student_id int not null, > name varchar(255) not null, > ...(略)... > create_at datetime null, > delete_at datetime null, > constraint fk_student_information > foreign key (student_id) references students(id), > primary key (id) > ); > create table clubs_students ( > id int not null auto_increment, > club_id int not null, > student_id int not null, > constraint fk_club > foreign key (club_id) references clubs(id), > constraint fk_student > foreign key (student_id) references students(id), > primary key (club_id, student_id) > ); > create table clubs_students_information ( > id int not null auto_increment, > clubs_students_id int not null, > ...(略)... > create_at datetime null, > delete_at datetime null, > constraint fk_club_student_information > foreign key (clubs_students_id) references clubs_students(id), > primary key (id) > ); > ---------------------------------------- > RoR > class Club < ActiveRecode::Base > has_and_belongs_to_many :students > has_many :club_information > ...(略)... > end > class ClubInformation < ActiveRecode::Base > belongs_to :club > ...(略)... > end > class Student < ActiveRecode::Base > has_and_belongs_to_many :clubs > has_many :student_information > ...(略)... > end > class StudentInformation < ActiveRecode::Base > belongs_to :student > ...(略)... > end > class ClubsStudents < ActiveRecode::Base > has_many :club_student_information > ...(略)... > end > class ClubsStudentsInformation < ActiveRecode::Base > belongs_to :club_student > ...(略)... > end > ここまで======================================== > > この変更により次の問題が発生します。 > ・全てのデータが物理削除ではなく論理削除になるため > 例外を除きSQLがinsertのみとなり > RoRでせっかく準備されているメソッドが > 使えなくなる(or 使いづらくなる) > (例外は削除日時のupdateのみ) > ・テーブル「clubs_students_information」の > カラム「clubs_students_id」が > RoRの単複数形の規約に則れない > ・クラス「ClubsStudents」・クラス「ClubsStudentsInformation」も > RoRの単複数形の規約に則れない > 等、他にも色々と問題が発生そうです。 > > このような場合、定石のようなモデルがあるのでしょうか。 > それとも、RoRには私の知らない宣言が準備されているのでしょうか。 > 良いアイディアをお持ちの方や > このような状況を経験された方はいらっしゃいませんでしょうか。 > > 宜しくお願いします。 > > -- > ML: rails@r... > 使い方: http://QuickML.com/ -- ML: rails@r... 使い方: http://QuickML.com/
2240 2007-06-22 13:35 [kanasansoft@g... ] 履歴を考慮した多対多のアソシエーション -> 2241 2007-06-22 17:27 ┗[sudo@w... ] 2244 2007-06-23 18:04 ┗[kanasansoft@g... ] 2247 2007-06-25 08:31 ┗[yamajaki@g... ] 2248 2007-06-26 03:36 ┗[kanasansoft@g... ]