2016-04-07 74 views
2

我遇到了以干净方式创建带有嵌套关联的新记录的问题。这里的控制器代码:Ruby on Rails - 使用需要此记录的嵌套关联保存新记录

@listing = current_user.listings.build(params[:listing].permit(ATTRIBUTES_FOR_CREATE)) 

这将构建一个实体与多个嵌套的关联,就像这样:

class ListingDataField < ActiveRecord::Base 
    belongs_to :listing 
    validates_presence_of :listing 
end 

然而,当我在控制器做@listing.save,我得到这些嵌套ListingDataField实体验证错误的是'列表不能为空'。如果我理解正确,AutosaveAssociation首先验证并保存嵌套关联,并最终保存顶层实体。因此,它无法验证ListingDataField,因为Listing尚未保存。

但我相信这是正确的:ListingDataField中的验证,所以我不会考虑删除它。我可以看到2个解决方案:

  1. 在交易 - 保存清单记录,然后通过一个
  2. @listing.save(:validate => false)建立嵌套协会 一个但这是太丑陋了

两者都没有那么多的优雅current_user.listings.build(...),所以我的问题是 - 这是什么适当的Rails方式?

P.S.我搜索SO类似的问题,但我找不到任何,希望这不是重复:)

回答

3

您是否尝试过加入:

class ListingDataField < ActiveRecord::Base 
    belongs_to :listing, inverse_of: :listing_data_fields 
    validates :listing, presence: true 
end 

class Listing < ActiveRecord::Base 
    has_many :listing_data_fields, inverse_of: :listing 
end 

这应该使验证在场工作。

+0

完美!事实上,我错过了这个开关 – neolancer