Rails 3, Acts_As_Taggable_On: уничтожение тегов и связанных постов после достижения лимита (пересмотрено) - PullRequest
0 голосов
/ 03 апреля 2011

Я работаю с жестким ограничением пространства базы данных.Поэтому в настоящее время я налагаю жесткое ограничение на количество сообщений на тег в моей базе данных, например:

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 сообщений на тег?Спасибо, что прочитали мой вопрос.

1 Ответ

1 голос
/ 03 апреля 2011

Ассоциация тегов является двунаправленной (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
...