我很难理解为什么“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中的错误吗?
答案 0 :(得分:0)
create
:创建一个对象(或多个对象)并将其保存到数据库中。
save
:如果模型是新的,则会在数据库中创建记录,否则现有记录会更新。
基本上你不能用create更新特定的记录,但是你可以保存。但是对于一个新的记录都可以使用,这取决于你是想用一行代码还是两行代码。
答案 1 :(得分:0)
你有很多事情要发生在这里:
我的提示(如你所说)是以敏捷的方式逐一解决这些问题。 在完成下一步之前,让每个部分都可以进行创建,编辑和查看。 这将有助于您前进。
最后需要注意的是,除非你先阅读/学习一些有很多网络资源,否则这些东西不会有多大意义。
我会尝试开始这样的事情:
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通过并将起作用所以我会从这开始。