app/models/commontator/comment.rb in commontator-6.0.0.pre.1 vs app/models/commontator/comment.rb in commontator-6.0.0.pre.2
- old
+ new
@@ -2,64 +2,45 @@
belongs_to :creator, polymorphic: true
belongs_to :editor, polymorphic: true, optional: true
belongs_to :thread, inverse_of: :comments
belongs_to :parent, optional: true, class_name: name, inverse_of: :children
- has_many :children, class_name: name, inverse_of: :parent
+ has_many :children, class_name: name, foreign_key: :parent_id, inverse_of: :parent
- serialize :ancestor_ids, Commontator::JsonArrayCoder
- serialize :descendant_ids, Commontator::JsonArrayCoder
-
validates :editor, presence: true, on: :update
validates :body, presence: true, uniqueness: {
- scope: [ :creator_type, :creator_id, :thread_id, :deleted_at ],
- message: I18n.t('commontator.comment.errors.double_posted')
+ scope: [ :creator_type, :creator_id, :thread_id, :deleted_at ], message: :double_posted
}
validate :parent_is_not_self, :parent_belongs_to_the_same_thread, if: :parent
- before_save :set_ancestor_ids_and_ancestor_descendant_ids
- before_destroy :remove_ancestor_descendant_ids
-
- cattr_accessor :will_paginate
- self.will_paginate = begin
- require 'will_paginate'
-
- true
- rescue LoadError
- false
- end
-
cattr_accessor :is_votable
self.is_votable = begin
require 'acts_as_votable'
acts_as_votable
true
rescue LoadError
false
end
- def self.will_paginate?
- will_paginate
- end
-
def self.is_votable?
is_votable
end
def is_modified?
!editor.nil?
end
def is_latest?
- thread.comments.last == self
+ thread.latest_comment(false) == self
end
def get_vote_by(user)
return nil unless self.class.is_votable? && !user.nil? && user.is_commontator
- votes_for.find_by(voter_type: user.class.name, voter_id: user.id)
+ # Preloaded with a condition in thread#nested_comments_for
+ votes_for.to_a.find { |vote| vote.voter_id == user.id && vote.voter_type == user.class.name }
end
def update_cached_votes(vote_scope = nil)
self.update_column(:cached_votes_up, count_votes_up(true))
self.update_column(:cached_votes_down, count_votes_down(true))
@@ -83,10 +64,16 @@
self.deleted_at = nil
self.editor = user
self.save
end
+ def body
+ is_deleted? ? I18n.t(
+ 'commontator.comment.status.deleted_by', deleter_name: Commontator.commontator_name(editor)
+ ) : super
+ end
+
def created_timestamp
I18n.t 'commontator.comment.status.created_at',
created_at: I18n.l(created_at, format: :commontator)
end
@@ -122,112 +109,28 @@
!thread.is_closed? && user == creator && (!is_deleted? || editor == user) &&
comment_del != :n && (is_latest? || comment_del == :a) && thread.can_be_read_by?(user)
end
def can_be_voted_on?
- !thread.is_closed? && !is_deleted? &&
- thread.config.comment_voting.to_sym != :n && self.class.is_votable?
+ !thread.is_closed? && !is_deleted? && thread.is_votable? && self.class.is_votable?
end
def can_be_voted_on_by?(user)
!user.nil? && user.is_commontator && user != creator &&
thread.can_be_read_by?(user) && can_be_voted_on?
end
protected
+ # These 2 validation messages are not currently translated because end users should never see them
def parent_is_not_self
return if parent != self
errors.add :parent, 'must be a different comment'
throw :abort
end
def parent_belongs_to_the_same_thread
return if parent.thread_id == thread_id
errors.add :parent, 'must belong to the same thread'
throw :abort
- end
-
- def remove_ancestor_descendant_ids
- return if ancestor_ids.empty?
-
- # Remove id and descendant_ids from ancestors
- self.class.where(id: ancestor_ids).order(:id).update_all("descendant_ids = #{
- ([ id ] + descendant_ids).reduce(self.class.arel_table[:descendant_ids]) do |memo, descendant_id|
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- memo, Arel::Nodes.build_quoted("[#{descendant_id}]"), Arel::Nodes.build_quoted('[]')
- ]), Arel::Nodes.build_quoted("[#{descendant_id},"), Arel::Nodes.build_quoted('[')
- ]), Arel::Nodes.build_quoted(",#{descendant_id},"), Arel::Nodes.build_quoted(',')
- ]), Arel::Nodes.build_quoted(",#{descendant_id}]"), Arel::Nodes.build_quoted(']')
- ])
- end.to_sql
- }")
-
- association(:parent).reset
- end
-
- def set_ancestor_ids_and_ancestor_descendant_ids
- return if ancestor_ids.first == parent_id
-
- pa = parent
-
- remove_ancestor_descendant_ids
-
- # Remove ancestor_ids from descendants
- unless ancestor_ids.empty? || descendant_ids.empty?
- self.class.where(id: descendant_ids).order(:id).update_all("ancestor_ids = #{
- ancestor_ids.reduce(self.class.arel_table[:ancestor_ids]) do |memo, ancestor_id|
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- memo, Arel::Nodes.build_quoted("[#{ancestor_id}]"), Arel::Nodes.build_quoted('[]')
- ]), Arel::Nodes.build_quoted("[#{ancestor_id},"), Arel::Nodes.build_quoted('[')
- ]), Arel::Nodes.build_quoted(",#{ancestor_id},"), Arel::Nodes.build_quoted(',')
- ]), Arel::Nodes.build_quoted(",#{ancestor_id}]"), Arel::Nodes.build_quoted(']')
- ])
- end.to_sql
- }")
-
- children.reset
- end
-
- if pa.nil?
- self.ancestor_ids = []
- else
- self.ancestor_ids = [ pa.id ] + pa.ancestor_ids
-
- # Add id and descendant_ids to ancestors
- descendant_ids_str = ([ id ] + descendant_ids).to_json[1..-2]
- self.class.where(id: ancestor_ids).order(:id).update_all("descendant_ids = #{
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('COALESCE', [
- self.class.arel_table[:descendant_ids], Arel::Nodes.build_quoted('[]')
- ]), Arel::Nodes.build_quoted(']'), Arel::Nodes.build_quoted(",#{descendant_ids_str}]")
- ]), Arel::Nodes.build_quoted('[,'), Arel::Nodes.build_quoted('[')
- ]).to_sql
- }")
-
- association(:parent).reset
-
- # Add ancestor_ids to descendants
- unless descendant_ids.empty?
- ancestor_ids_str = ancestor_ids.to_json[1..-2]
- self.class.where(id: descendant_ids).order(:id).update_all("ancestor_ids = #{
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('REPLACE', [
- Arel::Nodes::NamedFunction.new('COALESCE', [
- self.class.arel_table[:ancestor_ids], Arel::Nodes.build_quoted('[]')
- ]), Arel::Nodes.build_quoted(']'), Arel::Nodes.build_quoted(",#{ancestor_ids_str}]")
- ]), Arel::Nodes.build_quoted('[,'), Arel::Nodes.build_quoted('[')
- ]).to_sql
- }")
-
- children.reset
- end
- end
end
end