考虑以下简化模型
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
尚不可用。
人们通常在这做什么?是否习惯于将这种验证添加到连接表中,或者可以跳过这些验证?
答案 0 :(得分:1)
我建议Tagging
验证:tag
和:article
的存在,而不是ID。这有两个好处:
如果文章是新记录,Tagging
仍然有效。
如果article_id无效(例如-1),则Tagging
将无效。
我不同意之前评论者的建议,即完全删除验证,验证有助于避免创建错误的记录。例如Tagging
带有文章但没有标签。