验证关联对象上是否存在外键并使用collection.build

时间:2013-09-13 11:14:57

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我有以下型号:

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_id分配给价格。

在使用构建功能时,如何在外键上使用验证?

这似乎是一个非常标准的方案应该有用吗?

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

1 个答案:

答案 0 :(得分:0)

以Rails的方式,你可以这样做

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

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

你可以尝试这个宝石https://github.com/perfectline/validates_existence