Asocjacje polimorficzne

W poprzednim temacie poruszałem sprawe dziedziczenia i tabel http://forum.rubyonrails.pl/viewtopic.php?id=491
Qertoip zasugerował pare rzeczy i dzieki jego nieocenionej pomocy poradziłem sobie z tym, ale pojawił sie jak to zwykle bywa u początkującego nowy problem :slight_smile:

Chodzi o to zeby odwzorować powiązania gdzie typ IdentityDocument udostepnia interfejs :identificable (mniejsza o to czy to po angielsku gramatyczne:P) typom IdentityCard, Passport, DriveLicense itp.

Jeśli dobrze zrozumiałem idee tego to sprawa musi wygladac tak:

class IdentityDocument < ActiveRecord::Base belongs_to :identificable, :polymolrphic => true end
i np. przykladowa klasa ktora korzysta z identificable…

class DriveLicense < ActiveRecord::Base has_one :identity_document, :as => :identificable end
i migracje …

[code]class CreateIdentityDocuments < ActiveRecord::Migration
def self.up
create_table :identity_documents do |t|
t.column :identificable_id, :integer
t.column :identificable_type, :string, limit => 20
end
end

def self.down
drop_table :identity_documents
end
end[/code]

[code]class CreateDriveLicenses < ActiveRecord::Migration
def self.up
create_table :drive_licenses do |t|
t.column :serial_no_dl, :string, :limit => 20
end
end

def self.down
drop_table :drive_licenses
end
end[/code]
No i w zwiazku z tym pojawia się kilka pytań :stuck_out_tongue:

  1. Czy to jest prawidłowo zrealizowane :slight_smile:
  2. Czy ActiveRecord sam zadba o odpowiednie wstwienie kluczy obcych (zrealizowane w sql) w tabeli Identity_documents na podstawie nazw pol (_id - _type), czy trzeba dopisac jakies osobne metody? Wybaczcie jesli to glupie pytanie ale sie ucze.

Pozdrawiam i dzieki za odpowiedz :slight_smile:

Tak, wygląda w porządku. Drobiazg: DriveLicense => DrivingLicen[c|s]e.

Stworzenie klucza obcego w tabeli identity_documents jest technicznie niewykonalne, bo pole identificable_id wskazuje na różne tabele.

Inna sprawa, że railsowe migracje nigdy nie tworzą automatycznie kluczy obcych. Nie można ich również stworzyć ręcznie, chyba że żywym SQL-em. Jest to wada Rails, wynikająca z faktu, że DHH nie używa kluczy obcych.

Z pomocą przychodzi wtyczka Foreign Key Migrations.

Klucze obce powodują w Rails drobne problemy, ale warto ich używać.

W sumie racja po to są te dwa klucze zeby jednoznaczne uzyskac identyfikacje… :|, my fault

Jeszcze raz dzięki za pomoc, bo naprawde sie przydaje :slight_smile: