rails 4验证关联对象+ db约束

时间:2016-03-09 19:39:07

标签: ruby-on-rails database postgresql validation constraints

我试图在postgres db中的rails和约束中为外键字段添加验证。

我们说有一个userUser has_many :productsproduct belongs_to :user。在这种情况下,情况很容易,因为用户是在新产品添加时确定的。因此validates: user, presence: true可以添加到product modeluser_id, null: false可以添加postgres db

但是,如果同时创建父子对象和对象,该怎么办呢?让我们在product form我说product_features作为嵌套属性。所以product has_many :product_featuresproduct_feature belongs_to :product

根据Rails 4 Way:"当您尝试确保存在关联时,请传递validates_presence_of其外键属性,而不是关联变量本身。请注意,如果未保存父对象和子对象,则验证将失败(因为外键将为空白)。"

在这种情况下,如何在外键字段上实现模型验证和数据库约束?

3 个答案:

答案 0 :(得分:2)

在这种情况下,您只需在模型中创建自定义验证方法。

Product模型中编写以下验证方法,以确保product具有product_features

 validate :product_features

 def product_features
   product_features.present?
 end

答案 1 :(得分:2)

事实是,验证密钥本身的存在(例如。product_id)无论如何都是无用的,因为@product_feature.product_id = -25将通过验证。

我总是在关联上进行状态验证:

validates :product, presence: true

无论您以何种方式创建对象,这都会有效:

ProductFeature.new product: Product.new

...或...

Product.new product_features: [ ProductFeature.new ]

我不确定为什么有人会推荐其他任何东西,验证密钥本身并不能保证密钥存在于数据库中。

答案 2 :(得分:1)

这不会直接回答您的问题,但在使用嵌套表单时,您应该构建对象,如:

Product.product_features.new

这样您就可以确保product_id

中有product_feature