27 lines
760 B
Ruby
27 lines
760 B
Ruby
class Page < ApplicationRecord
|
|
belongs_to :report, touch: true
|
|
has_many :elements, -> { order(:position) }, dependent: :destroy
|
|
|
|
has_rich_text :comment
|
|
|
|
before_validation :set_position
|
|
before_update :update_positions, if: :position_changed?
|
|
|
|
def full_url
|
|
return nil if report.url.blank? && url.blank?
|
|
|
|
[ "https:/", report.url&.sub(/.*:\/\//, ""), url&.sub(/^\//, "") ].compact_blank.join("/")
|
|
end
|
|
|
|
private
|
|
def set_position
|
|
self.position ||= (report.pages.pluck(:position).max || 0) + 1
|
|
end
|
|
|
|
def update_positions
|
|
if position_was
|
|
report.pages.where("position > ?", position_was).update_all("position = position - 1")
|
|
end
|
|
report.pages.where(position: position..).update_all("position = position + 1")
|
|
end
|
|
end
|