我正在尝试对rails中的外键字段和postgres db中的约束添加验证。
假设有一个user
。User has_many :products
和product belongs_to :user
。在这种情况下,情况很容易,因为肯定会在添加新产品时创建用户。因此validates: user, presence: true
可以添加到中product model
,user_id, null: false
也可以添加到中postgres db
。
但是如果父子对象和该对象同时创建怎么办。假设在product form
我具有product_features
as嵌套属性中。所以product has_many :product_features
和product_feature belongs_to :product
。
根据Rails 4 Way的说法:“当您尝试确保存在关联时,请传递其外键属性而不是关联变量本身的validates_presence_。注意,在父对象和子对象都未保存的情况下,验证将失败(因为外键将为空白)。”
在这种情况下,如何在外键字段上实现模型验证和db约束?
事实是,验证密钥本身(例如product_id
)的存在是完全没有用的,因为@product_feature.product_id = -25
它将通过验证。
我总是对关联进行在线状态验证:
validates :product, presence: true
无论您以哪种方式创建对象,该方法都将起作用:
ProductFeature.new product: Product.new
...或者...
Product.new product_features: [ ProductFeature.new ]
我不确定为什么有人会推荐其他任何东西,对密钥本身进行验证并不能保证该密钥存在于数据库中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句