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.find_by(approved: false) end # Return a list of packages that have unapproved screenshots def self.requiring_moderation self.joins(:screenshots).where(screenshots: {approved:false}).distinct(:name) end end