我应该在连接表中验证外键吗?

时间:2012-11-15 20:49:46

标签: ruby-on-rails

考虑以下简化模型

class Article < ActiveRecord::Base
  has_many :taggings
  has_many :tags, through: :taggings
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :articles, through: :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :article
  validates :tag_id, :article_id, presence: true
end

我几乎跟着tagging railscast,除了我正在尝试为它编写测试。

Tagging模型中的验证,虽然没有在railscast中使用,但我自己添加了,这让我感到头疼。

如果我创建一篇新文章,我可以传递一个标签列表:

a = Article.new(title: "title", tag_list: "tag 1, tag 2")
a.valid? 
#=> false 
a.errors
# => 
  @base=#<Article id: nil, title: "title">, 
  @messages={:taggings=>["is invalid", "is invalid"]}> 

所以看起来我的标记类上的验证导致文章创建失败,因为article_id尚不可用。

人们通常在这做什么?是否习惯于将这种验证添加到连接表中,或者可以跳过这些验证?

1 个答案:

答案 0 :(得分:1)

我建议Tagging验证:tag:article的存在,而不是ID。这有两个好处:

  1. 如果文章是新记录,Tagging仍然有效。

  2. 如果article_id无效(例如-1),则Tagging将无效。

  3. 我不同意之前评论者的建议,即完全删除验证,验证有助于避免创建错误的记录。例如Tagging带有文章但没有标签。