2009-04-23 65 views
122

我一直無法找到Rails中的.build方法的任何文檔(我目前使用2.0.2)。Ruby on Rails。如何在屬於關係的情況下使用Active Record .build方法?

通過實驗,似乎可以使用構建方法在保存任何記錄之前將記錄添加到has_many關係中。

例如:

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 

這將節省狗和標籤與外鍵正常。這似乎並不適用於belongs_to關係。

d = Dog.new 
d.person.build # => nil object on nil.build 

我也曾嘗試

d = Dog.new 
d.person = Person.new 
d.save # => true 

Dog外鍵是不是在這種情況下,設定到期的事實,當時它被保存,新的人沒有一個id因爲它尚未保存。

我的問題是:

  1. 如何建設工作,使Rails是足夠聰明,知道如何記錄保存在正確的順序?

  2. 如何在belongs_to關係中做同樣的事情?

  3. 我在哪裏可以找到關於此方法的任何文檔?

謝謝

+0

關於文檔,請參閱滑軌指南[_ 「方法通過`belongs_to`加入」 _](http://guides.rubyonrails.org/association_basics.html#methods-added-by-belongs-to )和[_「由has_one添加的方法」_](http://guides.rubyonrails.org/association_basics.html#methods-added-by-has-one)。更多技術文檔可以在API文檔中找到:[`belongs_to`](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to)和 [`has_one`]] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one)。 – Dennis 2016-03-13 13:33:28

回答

140

凡有記載:

從的has_many協會下的API文檔中的 「Module ActiveRecord::Associations::ClassMethods

collection.build(屬性= {},... ) 返回 集合類型的一個或多個新對象,這些對象的實例化屬性爲 ,通過 外鍵鏈接到此對象的外鍵,但尚未被保存的 。注意:只有在關聯對象 已存在的情況下才可以使用,如果不存在,則不會使用 !

在相反方向構建的答案是語法略有改變。在與狗的例子,

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") 

甚至

t = Tag.new 
t.build_dog(:name => "Rover", :breed => "Maltese") 

您還可以使用create_dog有它立即保存(很像相應的「創造」的方法,你可以在集合調用)

鋼軌如何足夠聰明?這是魔術(或者更準確地說,我只是不知道,很想知道!)

+4

@BushyMark:它使用method_missing或metaporgramming將這些方法添加到define_method。 – Federico 2012-02-09 16:51:12

+0

@Federico缺少定義的方法在哪裏? – efoo 2012-08-15 15:54:50

40
@article = user.articles.build(:title => "MainTitle") 
@article.save 
相關問題