debshots/app/models/package.rb

63 lines
1.9 KiB
Ruby

class Package < ActiveRecord::Base
# PostgreSQL-based full-text search:
# https://github.com/Casecommons/pg_search
include PgSearch
# TODO: Make search weighted on users' rating
pg_search_scope :general_search,
:against => [:name, :description, :long_description],
:using => {
:tsearch => {:dictionary => "english"}
}
# I am using "destroy_all" here so that when a package gets destroys the
# callbacks for all dependent screenshots are executed - thus removing the
# screenshot files from disk.
has_many :screenshots, :inverse_of=>:package, :dependent => :destroy
default_scope {
order('name ASC')
}
# Return a query of all packages that have screenshots
def self.with_screenshots
# Query for all packages who's ID appears in a screenshot's "package_id" field
subselect = Screenshot.select(:package_id)
where(id: subselect )
end
# Return a query of all packages that have screenshots
def self.without_screenshots
# Query for all packages who's ID does not appear in a screenshot's "package_id" field
subselect = Screenshot.select(:package_id)
where.not(id: subselect)
end
# Return a query of all approved/public screenshots of this package
def screenshots_approved
self.screenshots.find_by(approved: true)
end
# Return a query of all approved/public screenshots of this package
def screenshots_pending
self.screenshots.where('approved=false or markedfordelete=true')
end
# Return a list of packages that have unapproved screenshots
def self.requiring_moderation
self.joins(:screenshots).where(screenshots: {approved:false}).distinct(:name)
end
def screenshots_sorted_by_version
self.screenshots.to_a.sort do |x,y|
version_x = DebImporter::Version.new(x.version)
version_y = DebImporter::Version.new(y.version)
if version_x<version_y
1
elsif version_x>version_y
-1
else
0
end
end
end
end