我在以干净的方式创建带有嵌套关联的新记录时遇到问题。这是控制器代码:
@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中列出验证是正确的,所以我不会考虑删除它。我可以看到两个解决方案:
- 在事务中保存Listing记录,然后构建嵌套关联一个接一个
@listing.save(:validate => false)
,但这太难看了
两者都不如current_user.listings.build(...)
那么优雅,所以我的问题是——Rails对此的正确方式是什么?
附言:我在SO中搜索了类似的问题,但没有找到,希望这不是重复的:)
您是否尝试添加:
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
这应该使存在的验证工作。