49 lines
1023 B
Ruby
49 lines
1023 B
Ruby
class SDG::Target < ApplicationRecord
|
|
include Comparable
|
|
include SDG::Related
|
|
|
|
validates :code, presence: true, uniqueness: true
|
|
validates :goal, presence: true
|
|
|
|
belongs_to :goal
|
|
has_many :local_targets, dependent: :destroy
|
|
|
|
def title
|
|
I18n.t("sdg.goals.goal_#{goal.code}.targets.target_#{code_key}.title")
|
|
end
|
|
|
|
def <=>(goal_or_target)
|
|
if goal_or_target.class == self.class
|
|
[goal.code, numeric_subcode] <=> [goal_or_target.goal.code, goal_or_target.numeric_subcode]
|
|
elsif goal_or_target.class == goal.class
|
|
-1 * (goal_or_target <=> self)
|
|
elsif goal_or_target.class.name == "SDG::LocalTarget"
|
|
[self, -1] <=> [goal_or_target.target, 1]
|
|
end
|
|
end
|
|
|
|
def self.[](code)
|
|
find_by!(code: code)
|
|
end
|
|
|
|
protected
|
|
|
|
def numeric_subcode
|
|
if subcode.to_i > 0
|
|
subcode.to_i
|
|
else
|
|
subcode.to_i(36) * 1000
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def code_key
|
|
code.gsub(".", "_").upcase
|
|
end
|
|
|
|
def subcode
|
|
code.split(".").last
|
|
end
|
|
end
|