我试图在postgres db中的rails和约束中为外键字段添加验证。
我们说有一个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
作为嵌套属性。所以product has_many :product_features
和product_feature belongs_to :product
。
根据Rails 4 Way:"当您尝试确保存在关联时,请传递validates_presence_of其外键属性,而不是关联变量本身。请注意,如果未保存父对象和子对象,则验证将失败(因为外键将为空白)。"
在这种情况下,如何在外键字段上实现模型验证和数据库约束?
答案 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