我在以干净的方式创建具有嵌套关联的新记录时遇到问题。这是控制器代码:
@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个解决方案:
@listing.save(:validate => false)
但这太难看了两者都不如current_user.listings.build(...)
那么优雅,所以我的问题是 - 对于这种情况,Rails的正确方法是什么?
P.S。我在SO搜索类似的问题,但我找不到任何东西,希望这不是重复:)
答案 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
这应该验证存在工作。