0

我有以下型号:

class Price < ActiveRecord::Base
  belongs_to :article, inverse_of: :prices
  validates :article_id, presence: true
end

class Article < ActiveRecord::Base
  has_many :prices, dependent: :destroy, inverse_of: :article
end

创建它们时的代码在保存时会引发验证错误(价格无效):

article = Article.new
article.prices.build( { amount: 55.0 } )
article.save! #=> Validation failed: Prices is invalid

所以 Rails 不够聪明,无法将父对象(Article)保存在子对象(Prices)之前,因此 article_id 可以在保存之前分配给价格。

使用构建功能时如何对外键进行验证?

这似乎是一个非常标准的场景,应该可以工作?

(我知道您可以使用数据库级别的约束,但我在这里询问应用程序级别的验证)

4

1 回答 1

0

在 Rails 方式中,您可以这样做

class Article < ActiveRecord::Base
  has_many :prices, dependent: :destroy, inverse_of: :article
  validates_associated :prices
end

但这不是 100% 的解决方案。

你可以试试这个 gem https://github.com/perfectline/validates_existence

于 2013-09-13T11:30:39.213 回答