2010-12-10 11 views
1

Ich habe zwei Modelle: Benutzer und HairColor. Ein Benutzer hat nur eine Haarfarbe, kann aber viele Haarfarbenpräferenzen haben. Was ist der beste Weg, dies zu modellieren?Schienen: Wie modelliere ich Präferenzen? Sollte ich has_many: durch?

Hier ist, was ich begann zu tun:

#models/user.rb 
class User < ActiveRecord::Base 
    belongs_to :hair_color 
    has_many :preferences, 
    has_many :hair_colors, :through => :preferences 
end 

#models/hair_color.rb 
class HairColor < ActiveRecord::Base 
    has_many :users 
end 

#models/preference.rb 
class Preference < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :hair_color 
end 

Nutzen has_many: durch den richtigen Ansatz? Auch wenn ich das auf andere Attribute wie "Augenfarbe" erweitern möchte? (Ein Benutzer hat eine Augenfarbe, sondern kann viele Augenfarben bevorzugen“

Antwort

1

Es wird eine begrenzte Menge an Haarfarben sein, so dass die Präferenztabelle ein hair_color_id haben muss und wie so einrichten:

#models/user.rb 
class User < ActiveRecord::Base 
    has_one :hair_color 
    has_many :preferences 
end 

#models/hair_color.rb 
class HairColor < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :preference 
end 

#models/preference.rb 
class Preference < ActiveRecord::Base 
    belongs_to :user 
    has_many :hair_color 
end 

ich glaube, das ist richtig. Lassen Sie mich wissen, wenn Sie in irgendwelche Tücken laufen.


wenn Sie die Augenfarbe oder eine andere Eigenschaft hinzufügen, werden Sie wahrscheinlich etwas anderes mit Vorliebe zu tun haben. ich hätte 4 Spalten an diesem Punkt: id, user_id, foreign_id, foreign_type

foreign_id wäre die ID aus der eye_color/hair_color Tabelle, und foreign_type wäre "Auge" oder "Haar" oder so. Dann in Ihrem Modell, würden Sie so etwas wie diese:

#models/hair_color.rb 
class HairColor < ActiveRecord::Base 
    belongs_to :user 
    has_many :preferences, :foreign_key => :foreign_id, :conditions => { "preferences.foreign_type" => "hair" } 
end 

Das ist ein wenig verrückt wird, aber es ist die DRY Art und Weise tun. Du würdest dasselbe in deine eye_color.rb schreiben und einfach "hair" durch "eye" für den foreign_typ ersetzen.

+0

Danke! Werde es ausprobieren. Um weitere Einstellungen wie "Augenfarbe" hinzuzufügen, müsste ich nur eine "eye_color_id" -Spalte zur Präferenztabelle hinzufügen? Oder sollte ich die Einstellungen in verschiedene Modelle wie "HairColorPreference" und "EyeColorPreference" unterteilen? Ich bin mir nicht sicher, welches das DRY wäre. – Chanpory

+0

Für weitere Fragen aktualisiert. –

+0

Chuck, das ist großartig. Ich raufte mir die Haare, versuchte herauszufinden und zu verstehen, was passiert ist. Dies scheint der DRY-Ansatz zu sein. Jetzt werde ich es ausprobieren und dann versuchen, ein Formular zum Auswählen von Einstellungen in einer Ansichtsvorlage zu erstellen. Neu bei Ruby on Rails, aber hoffentlich ist es nicht zu schwer. Vielen Dank! – Chanpory

Verwandte Themen