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

テストを書こうとしている以外は、レールキャストのタグ付けにほぼ従っています。

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ているようです。まだ利用できないためです。

人々は通常ここで何をしますか? テーブルを結合するためにそのような検証を追加するのは慣例ですか、それともスキップできますか?

4

1 に答える 1

1

I would suggest that Tagging validates the presence of :tag and :article, rather than the IDs. This has two benefits:

  1. If the article is a new record, the Tagging will still be valid.

  2. If the article_id is invalid (e.g. -1), the Tagging will be invalid.

I disagree with the previous commenters' suggestion to remove the validation altogether, validations help avoid creating bad records. E.g a Tagging with an article but not a tag.

于 2012-12-15T18:25:56.727 に答える