discourse/app/models/category.rb

75 lines
2.4 KiB
Ruby
Raw Normal View History

2013-02-06 03:16:51 +08:00
class Category < ActiveRecord::Base
belongs_to :topic, dependent: :destroy
2013-03-08 21:34:19 +08:00
belongs_to :topic_only_relative_url,
select: "id, title",
class_name: "Topic",
foreign_key: "topic_id"
2013-02-06 03:16:51 +08:00
belongs_to :user
has_many :topics
2013-02-07 23:45:24 +08:00
has_many :category_featured_topics
2013-02-06 03:16:51 +08:00
has_many :featured_topics, through: :category_featured_topics, source: :topic
has_many :category_featured_users
has_many :featured_users, through: :category_featured_users, source: :user
2013-02-20 11:24:38 +08:00
validates_presence_of :user_id
2013-02-06 03:16:51 +08:00
validates_presence_of :name
2013-02-07 23:45:24 +08:00
validates_uniqueness_of :name
2013-02-06 03:16:51 +08:00
validate :uncategorized_validator
after_save :invalidate_site_cache
after_destroy :invalidate_site_cache
scope :popular, lambda { order('topic_count desc') }
2013-02-07 23:45:24 +08:00
def uncategorized_validator
2013-02-06 03:16:51 +08:00
return errors.add(:name, I18n.t(:is_reserved)) if name == SiteSetting.uncategorized_name
return errors.add(:slug, I18n.t(:is_reserved)) if slug == SiteSetting.uncategorized_name
end
# Recalculates `topics_year`, `topics_month`, and `topics_week`
# for each Category.
2013-02-06 03:16:51 +08:00
def self.update_stats
topics = Topic
.select("COUNT(*)")
.where("topics.category_id = categories.id")
.where("categories.topic_id <> topics.id")
.visible
topics_year = topics.created_since(1.year.ago).to_sql
topics_month = topics.created_since(1.month.ago).to_sql
topics_week = topics.created_since(1.week.ago).to_sql
2013-02-26 00:42:20 +08:00
Category.update_all("topics_year = (#{topics_year}),
topics_month = (#{topics_month}),
topics_week = (#{topics_week})")
2013-02-06 03:16:51 +08:00
end
def topic_url
2013-03-08 21:34:19 +08:00
topic_only_relative_url.try(:relative_url)
2013-02-06 03:16:51 +08:00
end
2013-02-07 23:45:24 +08:00
2013-02-06 03:16:51 +08:00
before_save do
self.slug = Slug.for(self.name)
end
after_create do
topic = Topic.create!(title: I18n.t("category.topic_prefix", category: name), user: user, pinned_at: Time.now)
post_contents = I18n.t("category.post_template", replace_paragraph: I18n.t("category.replace_paragraph"))
topic.posts.create!(raw: post_contents, user: user)
2013-02-06 03:16:51 +08:00
update_column(:topic_id, topic.id)
topic.update_column(:category_id, self.id)
2013-02-07 23:45:24 +08:00
end
2013-02-06 03:16:51 +08:00
def self.post_template
I18n.t("category.post_template", replace_paragraph: I18n.t("category.replace_paragraph"))
end
2013-02-06 03:16:51 +08:00
# We cache the categories in the site json, so we need to invalidate it when they change
def invalidate_site_cache
Site.invalidate_cache
end
end