Ruby on Rails. Jak korzystać z rekordu aktywnego.metoda budowania w a: należy do Związku?
Nie udało mi się znaleźć żadnej dokumentacji .metoda build w Rails (obecnie używam 2.0.2).
Poprzez eksperymentowanie wydaje się, że możesz użyć metody budowania, aby dodać rekord do relacji has_many
, zanim któryś z rekordów 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
To odpowiednio zapisze psa i przywieszkę z zagranicznymi kluczami. To chyba nie działa w związku belongs_to
.
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 w Dog
nie jest ustawiona w tym przypadku ze względu na fakt, że w czasie zapisywania nowa osoba nie ma identyfikatora, ponieważ nie została jeszcze zapisana.
Moje pytania to:
Jak działa build, aby Rails był wystarczająco inteligentny, aby dowiedzieć się, jak zapisać rekordy w odpowiedniej kolejności?
Jak mogę zrobić to samo w
belongs_to
związku?Gdzie mogę znaleźć dokumentację dotyczącą tej metody?
Dziękuję
2 answers
Gdzie jest udokumentowane:
Z dokumentacji API pod asocjacją has_many w "Module ActiveRecord:: Associations:: ClassMethods "
Kolekcja.build (attributes = {}, …) Zwraca jeden lub więcej nowych obiektów typ kolekcji, które zostały utworzone z atrybutami i połączony z tym obiektem poprzez klucz obcy, ale nie zostały jeszcze uratowany. Uwaga: działa to tylko wtedy, gdy obiekt już istnieje, nie jeśli to zero!
Odpowiedzią na budowanie w przeciwnym kierunku jest nieco zmieniona składnia. W twoim 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 również użyć create_dog, aby natychmiast go zapisać (podobnie jak odpowiednia metoda "create", którą możesz wywołać na kolekcji)
Jak rails jest wystarczająco inteligentny? To magia (a dokładniej, po prostu nie wiem, chciałbym się dowiedzieć!)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 23:09:04
@article = user.articles.build(:title => "MainTitle")
@article.save
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-15 16:01:25