Ich verwende eine Legacy-Datenbank, so dass ich keine Kontrolle über das Datenmodell habe. Sie verwenden eine Menge polymorpher Link/Join-Tabellen, wie diese
create table person(per_ident, name, ...)
create table person_links(per_ident, obj_name, obj_r_ident)
create table report(rep_ident, name, ...)
どこ obj_name
ist der Tabellenname, und obj_r_ident
ist der Bezeichner. Verknüpfte Berichte würden also wie folgt eingefügt werden:
insert into person(1, ...)
insert into report(1, ...)
insert into report(2, ...)
insert into person_links(1, 'REPORT', 1)
insert into person_links(1, 'REPORT', 2)
Und dann hätte Person 1 2 verknüpfte Berichte, 1 und 2.
Ich kann die möglichen Vorteile eines solchen Datenmodells verstehen, aber ich sehe vor allem ein großes Manko: Die Verwendung von Constraints ist nicht möglich, um die Datenintegrität zu gewährleisten. Aber leider kann ich das nicht mehr ändern.
Aber um dies in Rails zu verwenden, war ich auf polymorphe Assoziationen suchen, aber nicht eine schöne Art und Weise, dies zu lösen (da ich nicht die Spaltennamen ändern kann, und fand nicht leicht einen Weg, das zu tun).
Ich habe jedoch eine Lösung gefunden. Bitte machen Sie Vorschläge.
class Person < ActiveRecord::Base
set_primary_key "per_ident"
set_table_name "person"
has_and_belongs_to_many :reports,
:join_table => "person_links",
:foreign_key => "per_ident",
:association_foreign_key => "obj_r_ident",
:conditions => "OBJ_NAME='REPORT'"
end
class Report < ActiveRecord::Base
set_primary_key "rep_ident"
set_table_name "report"
has_and_belongs_to_many :persons,
:join_table => "person_links",
:foreign_key => "obj_r_ident",
:association_foreign_key => "per_ident",
:conditions => "OBJ_NAME='REPORT'"
end
Das funktioniert, aber ich frage mich, ob es eine bessere Lösung gibt, die polymorphe Assoziationen verwendet.