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

但是,所有帖子都属于至少一个标签到acts_as_taggable_on. 我将如何更改此代码以将其限制为最多 100 个标签和每个标签 100 个帖子,而不是每个标签仅 100 个帖子?感谢您阅读我的问题。

4

1 回答 1

1

标签关联是双向的(has_many :through),因此@post.tags.count可以获取标签数量并@tag.posts.count获取帖子数量。Post 模型中的验证。通过在 Post 模型中添加自定义验证,您可以在将单个对象提交到数据库之前执行所有帖子和标签限制。

这种方法可能对你有用。这个想法是,在提交之前,一个 Post 会验证其关联的标签(通过 Taggings),并且它也会验证自己。标签会自我验证,并且暗示,如果每个标签的帖子过多,则帖子将使帖子无效。您可能需要根据设置标记的方式调整名称。

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 回答