0

私はデータベーススペースに厳しい制限を設けて作業しています。そのため、現在、データベース内のタグごとの投稿数に次のように厳しい制限を設けています。

post.rb:

class Post < ActiveRecord::Base
  acts_as_taggable
  after_create         :destroy_old_posts

  # ...

  protected
  def destroy_old_posts
    self.tag_list.each do |tag|
      posts = Post.tagged_with(tag, :order => 'updated_at DESC')
      posts[100..-1].each {|p| p.destroy } if posts.size >= 100
    end
  end
end

ただし、すべての投稿は、を介して少なくとも1つのタグに属しacts_as_taggable_onます。このコードを変更して、タグあたり100投稿だけでなく、最大100タグとタグあたり100投稿に制限するにはどうすればよいですか?私の質問を読んでいただきありがとうございます。

4

1 に答える 1

1

タグの関連付けは双方向(has_many:through)であるため@post.tags.count、タグ@tag.posts.countの数と投稿の数を取得します。Postモデルでの検証。Postモデルにカスタム検証を追加することにより、個々のオブジェクトがデータベースにコミットされる前に、すべての投稿とタグの制限を実行できます。

このアプローチはあなたのために働くかもしれません。投稿は、コミットされる前に、関連付けられたタグを検証し(ただし、タグ付けも)、それ自体も検証するという考え方です。タグはそれ自体を検証し、暗黙のうちに、タグごとの投稿が多すぎる場合は投稿を無効にします。タグ付けの設定方法に合わせて名前を調整する必要がある場合があります。

class Post
  acts_as_taggable
  validates_associated :taggings
  validates :database_limits

  private
  def database_limits
    self.errors.add(:name, "too many tags") if self.tags.count > 100
  end
end

class Taggings
  validates_associated :tags
end

class Tag
  validates :database_limits

  private
  def database_limits
    self.errors.add(:name, "too many posts for this tag") if self.posts.count > 100
  end
end
于 2011-04-03T02:20:52.910 に答える