2011-03-23 94 views
0

我刚刚发现rails 2.3.5和rails 2.3.8之间的行为发生了变化,我找不到任何使用Google的东西。对rails 2.3.5和rails之间的accepters_nested_attributes_for的兼容性2.3.8

我不得不车型

class Book < ActiveRecord::Base 
    has_many :authors 
    accepts_nested_attributes_for authors 
end 

class Author < ActiveRecord::Base 
    belongs_to :book 
end 

我有一个观点来写一本书与嵌套视图作者。

成册控制器我有一个更新动作

def update 
    @book = Book.find(params[:id]) 
    @book.attributes = params[:book] 
    .... 
end 

params[:book]看看喜欢这样的:

{:name=>"a great book", "authors_attributes"=>{"1"=>{:id"=>"2", "_destroy"=>"", :name => "Boney M"}}} 

后者我proccess,我要访问我的更新集合(保存书对象之前,例如验证),使用rails 2.3.5 @ book.authors为我提供了作者集合,其值更新为params [:book] hash。但是在2.3.8中,它给了我从数据库重新加载的作者集合。

我的问题来自函数assign_nested_attributes_for_collection_association(/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/nested_attributes.rb)。它用@loaded = false返回一个AssociationProxy对象。因此,我第一次使用@ book.authors访问我的集合时,它会从db重新加载它。对于rails 2.3.5,情况并非如此。

我在这里遗漏了什么,或者这个新行为已经报道过某处?

在此先感谢您的帮助。

回答

0

不知道这是否有关,但我只是注意到,当我从2.3.5更新我的应用程序2.3.8我不能再更新相关的记录。系统会忽略已有记录的更新信息,并且只会添加新记录。我发现,如果我想更新关联的记录,我必须从数据库中删除它,然后再次创建它。完全吮吸。

class Product < ActiveRecord::Base 
    has_many :allowed_design_types, :dependent => :destroy, :include => [:design_type], :order => 'design_types.name' 
    has_many :design_types, :through => :allowed_design_types 
    accepts_nested_attributes_for(
     :allowed_design_types, 
     :allow_destroy => true, 
     :reject_if => proc { |obj| p obj; !['1', 'true'].include?(obj.delete('allow')) } 
    ) 
end 

这在PARAMS被发送,但被完全忽视:

"product"=>{"allowed_design_types_attributes"=>{"0"=>{"design_type_id"=>"5", "allow"=>"1", "product_id"=>"1", "id"=>"45", "your_price"=>"3", "_destroy"=>""}}