module SocialStream module Models # {Subject Subjects} are subtypes of {Actor Actors}. {SocialStream Social Stream} provides two # {Subject Subjects}, {User} and {Group} # # Each {Subject} must defined in +config/initializers/social_stream.rb+ in order to be # included in the application. # # = Scopes # There are several scopes available for subjects # # alphabetic:: sort subjects by name # name_search:: simple search by name # distinct_initials:: get only the first letter of the name # followed:: sort by most following incoming {Tie ties} # liked:: sort by most likes # module Subject extend ActiveSupport::Concern included do subtype_of :actor, :build => { :subject_type => to_s } has_one :profile, :through => :actor validates_presence_of :name accepts_nested_attributes_for :profile scope :alphabetic, joins(:actor).merge(Actor.alphabetic) scope :letter, lambda{ |param| joins(:actor).merge(Actor.letter(param)) } scope :name_search, lambda{ |param| joins(:actor).merge(Actor.name_search(param)) } scope :tagged_with, lambda { |param| if param.present? joins(:actor => :activity_object).merge(ActivityObject.tagged_with(param)) end } scope :distinct_initials, joins(:actor).merge(Actor.distinct_initials) scope :followed, lambda { joins(:actor). order("actors.follower_count DESC") } scope :liked, lambda { joins(:actor => :activity_object). order('activity_objects.like_count DESC') } scope :most, lambda { |m| types = %w( followed liked ) if types.include?(m) __send__ m end } define_index do indexes actor.name, :sortable => true indexes actor.email indexes actor.slug has created_at end end module ClassMethods def find_by_slug(perm) includes(:actor).where('actors.slug' => perm).first end def find_by_slug!(perm) find_by_slug(perm) || raise(ActiveRecord::RecordNotFound) end end def to_param slug end end end end