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:

  1. Jak działa build, aby Rails był wystarczająco inteligentny, aby dowiedzieć się, jak zapisać rekordy w odpowiedniej kolejności?

  2. Jak mogę zrobić to samo w belongs_to związku?

  3. Gdzie mogę znaleźć dokumentację dotyczącą tej metody?

Dziękuję

Author: Josh Crozier, 2009-04-24

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ć!)

 143
Author: BushyMark,
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
 42
Author: nehpets,
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