- has_many :tags, :class_name => 'Tracetag', :foreign_key => 'gpx_id', :dependent => :delete_all
- has_many :points, :class_name => 'Tracepoint', :foreign_key => 'gpx_id', :dependent => :delete_all
-
- scope :visible, where(:visible => true)
- scope :visible_to, lambda { |u| visible.where("visibility IN ('public', 'identifiable') OR user_id = ?", u) }
- scope :public, where(:visibility => ["public", "identifiable"])
-
- validates_presence_of :user_id, :name, :timestamp
- validates_presence_of :description, :on => :create
- validates_length_of :name, :maximum => 255
- validates_length_of :description, :maximum => 255
-# validates_numericality_of :latitude, :longitude
- validates_inclusion_of :inserted, :in => [ true, false ]
- validates_inclusion_of :visibility, :in => ["private", "public", "trackable", "identifiable"]
-
- def destroy
- super
- FileUtils.rm_f(trace_name)
- FileUtils.rm_f(icon_picture_name)
- FileUtils.rm_f(large_picture_name)
- end
+ has_many :tags, :class_name => "Tracetag", :foreign_key => "gpx_id", :dependent => :delete_all, :inverse_of => :trace
+ has_many :points, :class_name => "Tracepoint", :foreign_key => "gpx_id", :dependent => :delete_all, :inverse_of => :trace
+
+ scope :visible, -> { where(:visible => true) }
+ scope :visible_to, ->(u) { visible.where(:visibility => %w[public identifiable]).or(visible.where(:user => u)) }
+ scope :visible_to_all, -> { where(:visibility => %w[public identifiable]) }
+ scope :tagged, ->(t) { joins(:tags).where(:gpx_file_tags => { :tag => t }) }
+
+ has_one_attached :file, :service => Settings.trace_file_storage
+ has_one_attached :image, :service => Settings.trace_image_storage
+ has_one_attached :icon, :service => Settings.trace_icon_storage
+
+ validates :user, :associated => true
+ validates :name, :presence => true, :length => 1..255, :characters => true
+ validates :description, :presence => { :on => :create }, :length => 1..255, :characters => true
+ validates :timestamp, :presence => true
+ validates :visibility, :inclusion => %w[private public trackable identifiable]
+
+ after_save :set_filename