institution.rb 1010 B

12345678910111213141516171819202122232425262728293031323334
  1. class Institution < ActiveRecord::Base
  2. require "csv"
  3. extend FriendlyId
  4. friendly_id :name, use: [:slugged, :history]
  5. has_many :action_institutions
  6. has_many :action_pages, through: :action_institutions
  7. has_many :affiliations
  8. validates_presence_of :name
  9. validates_uniqueness_of :name
  10. def self.import(names, action_page)
  11. names.each do |name|
  12. institution = self.find_or_create_by!(name: name)
  13. action_page.institutions << institution
  14. end
  15. return true
  16. end
  17. # Sort institutions by most popular.
  18. # Put `first` at the top of the list if it exists.
  19. def self.top(n, first: 0)
  20. select("institutions.*, COUNT(signatures.id) AS s_count")
  21. .joins("LEFT OUTER JOIN affiliations ON institutions.id = affiliations.institution_id")
  22. .joins("LEFT OUTER JOIN signatures ON affiliations.signature_id = signatures.id")
  23. .group("institutions.id")
  24. .order("institutions.id = #{first.to_i} desc", "s_count DESC", "institutions.name")
  25. .limit(n)
  26. end
  27. end