In diesem Beispiel erstelle ich ein user
mit no profile
und später ein profile
für diesen Benutzer. Ich habe versucht, Build mit einer has_one
Assoziation zu verwenden, aber das hat explodiert. Die einzige Möglichkeit, wie ich das sehe, ist die Verwendung has_many
. Der user
soll höchstens einen haben profile
.
Ich habe es versucht. Ich habe:
class User < ActiveRecord::Base
has_one :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Aber wenn ich es mache:
user.build_profile
Ich bekomme den Fehler:
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'profiles.user_id' in 'where clause': SELECT * FROM `profiles` WHERE (`profiles`.user_id = 4) LIMIT 1
Gibt es eine Möglichkeit in Schienen, 0 oder 1 Assoziation zu haben?
Antworten:
Die
build
Methodensignatur unterscheidet sich fürhas_one
undhas_many
Assoziationen.Die Build-Syntax für die
has_many
Zuordnung:Die Build-Syntax für die
has_one
Zuordnung:Lesen Sie den
has_one
Verein Dokumentation für weitere Details.quelle
user.build_profile
zum Bearbeiten.user.build_profile if user.profile.nil?
Wenn Sie beim Erstellen des Benutzers ein Profil erstellen möchten, schreiben Sieaccepts_nested_attributes_for :profile
dies ein Benutzermodell. und in der Form, in der der Benutzer erstellt wird, schreiben Sie<%= f.simple_fields_for :profile do |p| %>
diese und fahren Sie fort.build_<association>
) ein ziemlich seltsames und unerwartetes Verhalten in Rails ist, suchen viel mehr Menschen nach dieser Antwort als nach der Antwort der eigentlichen Fragen, wenn Sie wissen, was ich meine.Schauen Sie sich die Fehlermeldung genau an. Es sagt Ihnen, dass Sie keine erforderliche Spalte
user_id
in der Profiltabelle haben . Das Festlegen der Beziehungen im Modell ist nur ein Teil der Antwort.Sie müssen auch eine Migration erstellen, die die
user_id
Spalte zur Profiltabelle hinzufügt . Rails erwartet, dass dies vorhanden ist, und wenn dies nicht der Fall ist, können Sie nicht auf das Profil zugreifen.Weitere Informationen finden Sie unter folgendem Link:
Grundlagen der Vereinigung
quelle
rails g model profile user:references:index address:string bio:text
.Je nach Anwendungsfall kann es praktisch sein, die Methode zu verpacken und die Zuordnung automatisch zu erstellen, wenn sie nicht gefunden wird.
Wenn Sie jetzt die
#profile
Methode aufrufen , wird entweder das zugehörige Profil zurückgegeben oder eine neue Instanz erstellt.Quelle: Können Sie beim Patchen einer Methode durch Affen die überschriebene Methode aus der neuen Implementierung aufrufen?
quelle
def profile; super || build_profile; end
.Es sollte ein sein
has_one
. Wennbuild
es nicht funktioniert, können Sie einfach Folgendes verwendennew
:ist das gleiche wie
quelle