7 Stimmen

Schienen polymorphe Assoziation (Legacy-Datenbank)

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X