2011-11-14 36 views
0

我遇到麻煩,理解爲什麼使用這些模型與accept_nested_attributes_for「保存」和「創建」應該有什麼不同。這是我的模型:多個嵌套accept_nested_attributes和「保存」和「創建」之間的區別

所有的
class Book < ActiveRecord::Base 
    has_many :pages 
    has_many :picture_pages, :through => :pages, :source => :pagetype, :source_type => 'PicturePage' 
    accepts_nested_attributes_for :picture_pages 
end 

class PicturePage < ActiveRecord::Base 
    has_one :page, :as =>:pagetype 
    has_one :book, :through => :pages 
    accepts_nested_attributes_for :page 
end 

class Page < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :pagetype, :polymorphic => true, :dependent => :destroy 
end 

首先,使用保存方法....

b = Book.first 
params = { "page_attributes"=> { "number"=>"1" }} 
p = b.picture_pages.new(params) 
p.save 

...工作的事情像你期望的那樣。 Rails會自動創建一個新的PicturePage,並且有一個帶有分配的「number」屬性的相應的Page join模型。完善。但是,如果我這樣做:

b = Book.first 
params = { "page_attributes"=> { "number"=>"1" }} 
p = b.picture_pages.create(params) 

... Rails會創建兩個加盟模式,一種是完全空的,一個具有數屬性。爲什麼是這樣?

這是一個主要問題,如果我想在書籍模型上使用accepts_nested_attributes_for,因爲那麼Book模型會在它創建的PicturePage模型上自動調用「create」。

任何提示?這是Rails中的錯誤嗎?

回答

0

你必須要對很多事情在這裏:

  • 的has_many:通過的
  • 2接受嵌套屬性會左右逢源
  • 態關聯

我的小費(如你問)是以敏捷的方式逐一解決這些問題。 在進行下一步之前,讓每件作品都可以用於創建和編輯和查看。 這將幫助你大大前進。

  • 首先得到has_many的工作。
  • 然後獲得嵌套屬性的工作 - 並開始只有一個nested_attributes。
  • 最後研究多態關聯 - 但請注意,許多人避免或放棄多態關聯,因爲儘管它們顯得簡單,但它們對於一些很費勁。特別是如果像這樣組合,我不推薦他們用於rails新手。

最後需要說明的是,除非您先閱讀/學習導軌,並且有很多網頁資源,否則這些東西不會有很大的意義。

我會嘗試啓動是這樣的:

class Book < ActiveRecord::Base 
    has_many :page_pictures 
    has_many :pictures, :through => :page_pictures 
end 

class PagePicture < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :picture 
end 

class Picture < ActiveRecord::Base 
    has_many :page_pictures 
    has_many :books, :through => :page_pictures 
end 

現在允許的圖片是在你也許並不需要多頁和書籍,但是這是通過更「標準」的has_many並會工作,所以我會從這開始。

0

create:創建一個對象(或多個對象)並將其保存到數據庫。

save:如果模型是新建的,則會在數據庫中創建一條記錄,否則將更新現有記錄。

基本上你不能用create來更新特定的記錄,但用save可以。但是,對於一個新的記錄都可以使用,這取決於你是否想要在一行或兩行代碼中執行它。