Ich konnte keine Dokumentation zur .build-Methode in Rails finden (ich verwende derzeit 2.0.2).
Durch Experimentieren können Sie anscheinend die Erstellungsmethode verwenden, um einen Datensatz zu einer has_many
Beziehung hinzuzufügen, bevor einer der Datensätze gespeichert wurde.
Beispielsweise:
class Dog < ActiveRecord::Base
has_many :tags
belongs_to :person
end
class Person < ActiveRecord::Base
has_many :dogs
end
# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true
Dadurch werden sowohl der Hund als auch die Markierung mit den Fremdschlüsseln ordnungsgemäß gespeichert. Dies scheint in einer belongs_to
Beziehung nicht zu funktionieren .
d = Dog.new
d.person.build # => nil object on nil.build
Ich habe es auch versucht
d = Dog.new
d.person = Person.new
d.save # => true
Der Fremdschlüssel Dog
wird in diesem Fall nicht festgelegt, da die neue Person zum Zeitpunkt des Speicherns keine ID hat, da er noch nicht gespeichert wurde.
Meine Fragen sind:
Wie funktioniert Build, damit Rails intelligent genug ist, um herauszufinden, wie die Datensätze in der richtigen Reihenfolge gespeichert werden können?
Wie kann ich in einer
belongs_to
Beziehung dasselbe tun ?Wo finde ich Dokumentation zu dieser Methode?
Danke dir
quelle
belongs_to
" und "Methoden hinzugefügt vonhas_one
" . Weitere technische Dokumentationen finden Sie in den API-Dokumenten:belongs_to
undhas_one
.Antworten:
Wo es dokumentiert ist:
Aus der API-Dokumentation unter der Zuordnung has_many in " Module ActiveRecord :: Associations :: ClassMethods "
Die Antwort auf das Bauen in die entgegengesetzte Richtung ist eine leicht veränderte Syntax. In Ihrem Beispiel mit den Hunden,
oder auch
Sie können auch create_dog verwenden, um es sofort zu speichern (ähnlich wie die entsprechende "create" -Methode, die Sie für die Sammlung aufrufen können).
Wie sind Schienen klug genug? Es ist Magie (oder genauer gesagt, ich weiß es einfach nicht, würde es gerne herausfinden!)
quelle
find_by_email
undfind_by_column_name
Methoden fehlt . Es konvertiert die Methode, die Sie übergeben, in eine Zeichenfolge, zerlegt sie und versucht, sie mit den Spaltennamen Ihrer Tabelle abzugleichen.quelle