多个嵌套的accepts_nested_attributes以及“save”和“create”之间的区别

时间:2011-11-14 20:44:31

标签: ruby-on-rails nested associations fields-for

我很难理解为什么“save”和“create”应该使用这些带有accepts_nested_attributes_for的模型有所不同。这是我的模特:

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

首先,使用save方法....

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

......事情就像你期望的那样。 Rails将自动创建一个新的PicturePage,其中相应的页面连接模型具有指定的“数字”属性。完善。但如果我这样做:

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

... Rails将创建两个连接模型,一个完全为空,另一个具有数字属性。这是为什么?

如果我想在图书模型上使用accepts_nested_attributes_for,这是一个主要问题,因为Book模型会在它创建的PicturePage模型上自动调用“create”。

任何提示?这是Rails中的错误吗?

2 个答案:

答案 0 :(得分:0)

create:创建一个对象(或多个对象)并将其保存到数据库中。

save:如果模型是新的,则会在数据库中创建记录,否则现有记录会更新。

基本上你不能用create更新特定的记录,但是你可以保存。但是对于一个新的记录都可以使用,这取决于你是想用一行代码还是两行代码。

答案 1 :(得分:0)

你有很多事情要发生在这里:

  • has_many:通过's
  • 两个接受双向嵌套属性
  • 多态关联

我的提示(如你所说)是以敏捷的方式逐一解决这些问题。 在完成下一步之前,让每个部分都可以进行创建,编辑和查看。 这将有助于您前进。

  • 首先让has_many通过工作。
  • 然后让嵌套属性工作 - 并从一个nested_attributes开始。
  • 最后研究多态关联 - 但请注意,许多人避免或放弃多态关联,因为尽管它们显而易见,但它们对于某些人来说很狡猾。我不推荐它们用于rails newbies,特别是如果这样组合的话。

最后需要注意的是,除非你先阅读/学习一些有很多网络资源,否则这些东西不会有多大意义。

我会尝试开始这样的事情:

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通过并将起作用所以我会从这开始。