0

我很难理解为什么“保存”和“创建”在使用带有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

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

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

......事情就像你所期望的那样工作。Rails 将自动创建一个新的 PicturePage,并带有相应的 Page 连接模型,并分配有“数字”属性。完美的。但如果我这样做:

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

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

如果我想在书本模型上使用accepts_nested_attributes_for,这是一个主要问题,因为书本模型将在它正在创建的图片页面模型上自动调用“创建”。

有小费吗?这是Rails中的错误吗?

4

2 回答 2

0

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

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

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

于 2011-11-23T12:26:46.010 回答
0

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

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

我的建议(如您所问)是以敏捷的方式一一解决这些问题。在进行下一个之前,让每个部分都可以创建、编辑和查看。这将极大地帮助您前进。

  • 首先通过 has_many 的工作。
  • 然后让嵌套属性工作 - 并从一个nested_attributes 开始。
  • 最后研究多态关联 - 但请注意,许多人避免或放弃多态关联,因为尽管它们看起来很简单,但它们对某些人来说是繁琐的。我不建议将它们用于 Rails 新手,尤其是像这样组合时。

最后一点是,除非您先阅读/研究一下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 并且可以工作,所以我将从这个开始。

于 2011-11-23T12:43:14.460 回答