2012-11-15 60 views
3

考慮下面的簡化模型我應該驗證連接表中的外鍵嗎?

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除了我試圖寫的測試它。

標籤模型中的驗證不在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

您打算如何驗證這些限制?你在哪種情況下期望失敗?請花點時間思考並嘗試自己回答;-) 提示:如果發生以下情況,會發生什麼情況:tag_id或:article_id不在那裏? – awenkhh

+1

那麼,如果他們不在那裏,標籤就不會出現在屏幕上,真的沒什麼大不了的。我想應該沒問題了。 – stephenmurdoch

+1

所以你去;-)。我會建議刪除它們,因爲它們不會給你的應用程序帶來任何穩定性;-) – awenkhh

回答

1

我會建議Tagging驗證存在:tag:article,而不是ID。這有兩個好處:

  1. 如果文章是新記錄,Tagging仍然有效。

  2. 如果article_id無效(例如-1),則Tagging將無效。

我不同意以前的評論者的建議,完全刪除驗證,驗證有助於避免創建不良記錄。例如,帶有文章但不是標籤的Tagging

+0

啊,謝謝你的回覆,明天我會試一試,看起來這是最好的方法做到這一點,聰明的想法:) – stephenmurdoch

相關問題