【问题标题】:Validate presence of foreign key on associated objects and using collection.build验证关联对象上是否存在外键并使用 collection.build
【发布时间】:2013-09-18 01:28:54
【问题描述】:

我有以下型号:

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

在使用构建函数时如何对外键进行验证?

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

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

【问题讨论】:

  • 在建立价格之前不能保存文章吗?
  • 是的,这是一种解决方法。但这似乎是 Rails 中的一个问题,因为这个工作流程应该可以工作。
  • @depa 不,完全不同
  • 想解释一下为什么?您想要验证 has_many 关联的存在,这正是我链接的问题所问的。

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


【解决方案1】:

在 Rails 中你可以这样做

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

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

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

【讨论】:

  • 如果您说它不是 100% 的解决方案,那么 validates_associated :prices 会做什么?关于 gem,我不想验证实际对象的存在 - 仅当存在 artice_id 时。
  • 它将验证来自 Articles.save 的价格,但由于您正在寻找价格#article_id 的存在,因此即使这样也无法实现。验证存在往往会为此提供一些解决方案。
  • 不值得被否决。请明智地使用您的投票权
  • 它在网站上说,当答案没有用时,您应该按下投票按钮。而且您的回答没有回答问题,所以我找不到更好的情况来否决投票?我只希望其他访问者知道这不是问题的答案,不是个人问题。
猜你喜欢
  • 1970-01-01
  • 2019-11-19
  • 2022-11-21
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2011-02-21
  • 2023-03-23
  • 2021-10-01
相关资源
最近更新 更多