mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 10:29:35 +08:00
5f64fd0a21
Introduce new patterns for direct sql that are safe and fast. MiniSql is not prone to memory bloat that can happen with direct PG usage. It also has an extremely fast materializer and very a convenient API - DB.exec(sql, *params) => runs sql returns row count - DB.query(sql, *params) => runs sql returns usable objects (not a hash) - DB.query_hash(sql, *params) => runs sql returns an array of hashes - DB.query_single(sql, *params) => runs sql and returns a flat one dimensional array - DB.build(sql) => returns a sql builder See more at: https://github.com/discourse/mini_sql
63 lines
1.7 KiB
Ruby
63 lines
1.7 KiB
Ruby
require_dependency "discourse_diff"
|
|
|
|
class PostRevision < ActiveRecord::Base
|
|
belongs_to :post
|
|
belongs_to :user
|
|
|
|
serialize :modifications, Hash
|
|
|
|
after_create :create_notification
|
|
|
|
def self.ensure_consistency!
|
|
# 1 - fix the numbers
|
|
DB.exec <<-SQL
|
|
UPDATE post_revisions
|
|
SET number = pr.rank
|
|
FROM (SELECT id, 1 + ROW_NUMBER() OVER (PARTITION BY post_id ORDER BY number, created_at, updated_at) AS rank FROM post_revisions) AS pr
|
|
WHERE post_revisions.id = pr.id
|
|
AND post_revisions.number <> pr.rank
|
|
SQL
|
|
|
|
# 2 - fix the versions on the posts
|
|
DB.exec <<-SQL
|
|
UPDATE posts
|
|
SET version = 1 + (SELECT COUNT(*) FROM post_revisions WHERE post_id = posts.id),
|
|
public_version = 1 + (SELECT COUNT(*) FROM post_revisions pr WHERE post_id = posts.id AND pr.hidden = 'f')
|
|
WHERE version <> 1 + (SELECT COUNT(*) FROM post_revisions WHERE post_id = posts.id)
|
|
OR public_version <> 1 + (SELECT COUNT(*) FROM post_revisions pr WHERE post_id = posts.id AND pr.hidden = 'f')
|
|
SQL
|
|
end
|
|
|
|
def hide!
|
|
update_column(:hidden, true)
|
|
end
|
|
|
|
def show!
|
|
update_column(:hidden, false)
|
|
end
|
|
|
|
def create_notification
|
|
PostActionNotifier.after_create_post_revision(self)
|
|
end
|
|
|
|
end
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: post_revisions
|
|
#
|
|
# id :integer not null, primary key
|
|
# user_id :integer
|
|
# post_id :integer
|
|
# modifications :text
|
|
# number :integer
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# hidden :boolean default(FALSE), not null
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_post_revisions_on_post_id (post_id)
|
|
# index_post_revisions_on_post_id_and_number (post_id,number)
|
|
#
|