我有两个通过has_many
关系关联的模型。例如
class Newspaper < ActiveRecord::Base
has_many :articles
end
class Article < ActiveRecord::Base
belongs_to :newspaper
validates :uid, presence: true,
uniqueness: { case_sensitive: true }
end
一份报纸每天更新几次,但我们只想构建和添加不存在的文章到关联中。以下代码是我实现这一目标的第一步。
new_articles.each do |article|
unless newspaper.articles.exists? uid: article.uid
newspaper.articles.build(uid: article.uid)
end
end
报纸对象要么是新的且未保存,要么是在此时使用现有关系检索到的。
我的测试表明,我可以使用上面的代码向报纸添加具有相同 UID 的两篇文章,这显然不是我想要的。
在我看来,我当前的代码在保存时会导致验证失败,因为验证着眼于整个文章表的唯一性,而不是关联。
我正在努力理解的是该exists?
方法在这种情况下的行为方式(以及为什么它没有按计划保存我的培根)。我正在使用 FactoryGirl 构建一份报纸,添加一篇文章,然后模拟包含与我已经添加的文章具有相同 uid 的文章的更新。如果代码有效,我应该只得到一篇相关的文章,但我得到了两篇。使用其中之一build
或create
没有区别,因此文章记录是否已经存在于数据库中似乎不会改变结果。
谁能阐明我如何才能达到预期的结果,或者为什么该exists?
方法没有达到我的预期?
谢谢