Nie mogłem znaleźć żadnej dokumentacji na temat metody .build w Railsach (obecnie używam 2.0.2).
Wydaje się, że dzięki eksperymentom można użyć metody budowania, aby dodać rekord do has_many
relacji, zanim którykolwiek z nich zostanie zapisany.
Na przykład:
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
Pozwoli to poprawnie zapisać zarówno psa, jak i tag z kluczami obcymi. To nie wydaje się działać w belongs_to
związku.
d = Dog.new
d.person.build # => nil object on nil.build
Ja też próbowałem
d = Dog.new
d.person = Person.new
d.save # => true
Klucz obcy Dog
w tym przypadku nie jest ustawiony ze względu na fakt, że w momencie jego zapisywania nowa osoba nie ma identyfikatora, ponieważ nie został on jeszcze zapisany.
Moje pytania to:
Jak działa kompilacja, aby Railsy były wystarczająco sprytne, aby dowiedzieć się, jak zapisać rekordy we właściwej kolejności?
Jak mogę zrobić to samo w
belongs_to
związku?Gdzie mogę znaleźć dokumentację dotyczącą tej metody?
Dziękuję Ci
źródło
belongs_to
” i „Metody dodane przezhas_one
” . Więcej dokumentacji technicznej można znaleźć w dokumentacji API:belongs_to
ihas_one
.Odpowiedzi:
Gdzie jest to udokumentowane:
Z dokumentacji API pod asocjacją has_many w „ Module ActiveRecord :: Associations :: ClassMethods ”
Odpowiedzią na budowanie w przeciwnym kierunku jest nieco zmieniona składnia. W swoim przykładzie z psami
Class Dog has_many :tags belongs_to :person end Class Person has_many :dogs end d = Dog.new d.build_person(:attributes => "go", :here => "like normal")
lub nawet
t = Tag.new t.build_dog(:name => "Rover", :breed => "Maltese")
Możesz także użyć create_dog, aby zapisać go natychmiast (podobnie jak odpowiednia metoda "create", którą możesz wywołać w kolekcji)
Dlaczego szyny są wystarczająco inteligentne? To magia (a dokładniej, po prostu nie wiem, chciałbym się dowiedzieć!)
źródło
find_by_email
ifind_by_column_name
metod. Konwertuje przekazaną metodę na łańcuch, analizuje ją i próbuje dopasować do nazw kolumn tabeli.@article = user.articles.build(:title => "MainTitle") @article.save
źródło