Ruby on Rails - 使用需要此记录的嵌套关联保存新记录

时间:2016-04-07 23:16:22

标签: ruby-on-rails validation

我在以干净的方式创建具有嵌套关联的新记录时遇到问题。这是控制器代码:

@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。

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

  1. 在事务中 - 保存列表记录,然后构建嵌套关联 一个接一个
  2. @listing.save(:validate => false)但这太难看了
  3. 两者都不如current_user.listings.build(...)那么优雅,所以我的问题是 - 对于这种情况,Rails的正确方法是什么?

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

1 个答案:

答案 0 :(得分: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

这应该验证存在工作。