2009-06-06 7 views
2

Ich bin ein Neuling zu RoR - Ich habe drei Modelle: Customer, Job und Note. Kunden haben Jobs, und sowohl Kunden als auch Jobs können Notizen haben. Gibt es eine besondere Möglichkeit, diese Art von Beziehung in Rails zu behandeln, oder wird es funktionieren, wenn ich nur eine normale "genies_to" -Beziehung mit Note habe?Wie modelliert man eine Beziehung "kann zu A oder B gehören" in Rails?

Das Problem, das mich bewegt, ist die Note Felder mit sowohl customer_id und job_id aber nur ein einziges jemals für einen einzelnen Datensatz verwendet werden (dh eine bestimmte Note entweder auf einen Job oder einen Kunden beziehen kann, aber nie beides), und es fühlt sich nicht nach einem guten Datenbankdesign an, eine Spalte zu haben, die die Hälfte der Zeit null ist.

Überlege ich das, oder gibt es etwas, was mir nicht klar ist?

Antwort

4

Ich würde vorschlagen, eine polymorphe Assoziation zu verwenden, da sie flexibler und erweiterbar und einfacher durchzusetzen ist. Das Modell erforderlich ist unten:

class Note < ActiveRecord::Base 
    belongs_to :notable, :polymorphic => true 
end 

class Customer < ActiveRecord::Base 
    has_many :notes, :as => :notable 
end 

class Job < ActiveRecord::Base 
    has_many :notes, :as => :notable 
end 

mit Migrations

create_table :notes do |t| 
    t.references :notable, :polymorphic => {:default => 'Photo'} 
end 

Einzelheiten zu einer polymorphen Assoziation, ich google

+0

vorschlagen würde ich einen Blick auf Polymorphe Verbände nehmen werde; Vielen Dank! –

+0

Es gibt auch einen Railscast darüber: http://railscasts.com/episodes/154-polymorphic-association – Jarrod

+0

Habe gerade den Railscast ausgecheckt - das klingt nach * genau * was ich brauche. Vielen Dank! –

Verwandte Themen