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 self.screenshots_approved self.screenshots.find_by(approved: true) end # Return a query of all screenshots that the current user may see # Consists of: # - approved (public) screenshots # - screenshots uploaded by the user (determined by cookie session) def screenshots_visible_to_user(token) self.screenshots.where( # "approved=true" "approved=true OR uploaderhash=?", token ) end end