follow/like refactor to use polymorphic associations

This commit is contained in:
Brian Smith 2014-02-15 11:55:01 -05:00
parent 865d8c17b6
commit 5a03ec87ae
10 changed files with 159 additions and 55 deletions

View File

@ -106,4 +106,5 @@ track_connection_id_not_null.sql
recordings_all_discarded.sql recordings_all_discarded.sql
recordings_via_admin_web.sql recordings_via_admin_web.sql
relax_band_model_varchar.sql relax_band_model_varchar.sql
add_piano.sql add_piano.sql
like_follower_poly_assoc.sql

View File

@ -0,0 +1,59 @@
alter table music_sessions_history
add constraint music_sessions_history_pkey PRIMARY KEY (id);
CREATE TABLE likes
(
id character varying(64) NOT NULL DEFAULT uuid_generate_v4(),
liker_id character varying(64) NOT NULL,
user_id character varying(64),
band_id character varying(64),
session_id character varying(64),
recording_id character varying(64),
likable_type character varying(25),
created_at timestamp without time zone NOT NULL DEFAULT now(),
updated_at timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT likes_pkey PRIMARY KEY (id),
CONSTRAINT liker_fkey FOREIGN KEY (liker_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT user_likes_fkey FOREIGN KEY (user_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT bands_likes_fkey FOREIGN KEY (band_id)
REFERENCES bands (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT session_likes_fkey FOREIGN KEY (session_id)
REFERENCES music_sessions_history (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT recording_likes_fkey FOREIGN KEY (recording_id)
REFERENCES recordings (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT user_likes_uniqkey UNIQUE (liker_id, user_id),
CONSTRAINT band_likes_uniqkey UNIQUE (liker_id, band_id),
CONSTRAINT session_likes_uniqkey UNIQUE (liker_id, session_id),
CONSTRAINT recording_likes_uniqkey UNIQUE (liker_id, recording_id)
);
CREATE TABLE followings
(
id character varying(64) NOT NULL DEFAULT uuid_generate_v4(),
follower_id character varying(64) NOT NULL,
user_id character varying(64),
band_id character varying(64),
followable_type character varying(25),
created_at timestamp without time zone NOT NULL DEFAULT now(),
updated_at timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT followings_pkey PRIMARY KEY (id),
CONSTRAINT follower_fkey FOREIGN KEY (follower_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT user_followings_fkey FOREIGN KEY (user_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT bands_followings_fkey FOREIGN KEY (band_id)
REFERENCES bands (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT user_followings_uniqkey UNIQUE (follower_id, user_id),
CONSTRAINT band_followings_uniqkey UNIQUE (follower_id, band_id)
);

View File

@ -67,15 +67,15 @@ require "jam_ruby/models/invited_user"
require "jam_ruby/models/invited_user_observer" require "jam_ruby/models/invited_user_observer"
require "jam_ruby/models/artifact_update" require "jam_ruby/models/artifact_update"
require "jam_ruby/models/band_invitation" require "jam_ruby/models/band_invitation"
require "jam_ruby/models/band_liker" # require "jam_ruby/models/band_liker"
require "jam_ruby/models/band_follower" # require "jam_ruby/models/band_follower"
require "jam_ruby/models/band_following" # require "jam_ruby/models/band_following"
require "jam_ruby/models/band_musician" require "jam_ruby/models/band_musician"
require "jam_ruby/models/connection" require "jam_ruby/models/connection"
require "jam_ruby/models/friendship" require "jam_ruby/models/friendship"
require "jam_ruby/models/music_session" require "jam_ruby/models/music_session"
require "jam_ruby/models/music_session_comment" require "jam_ruby/models/music_session_comment"
require "jam_ruby/models/music_session_liker" # require "jam_ruby/models/music_session_liker"
require "jam_ruby/models/music_session_history" require "jam_ruby/models/music_session_history"
require "jam_ruby/models/music_session_user_history" require "jam_ruby/models/music_session_user_history"
require "jam_ruby/models/music_session_perf_data" require "jam_ruby/models/music_session_perf_data"
@ -83,17 +83,18 @@ require "jam_ruby/models/invitation"
require "jam_ruby/models/fan_invitation" require "jam_ruby/models/fan_invitation"
require "jam_ruby/models/friend_request" require "jam_ruby/models/friend_request"
require "jam_ruby/models/instrument" require "jam_ruby/models/instrument"
require "jam_ruby/models/like"
require "jam_ruby/models/musician_instrument" require "jam_ruby/models/musician_instrument"
require "jam_ruby/models/notification" require "jam_ruby/models/notification"
require "jam_ruby/models/track" require "jam_ruby/models/track"
require "jam_ruby/models/user_liker" # require "jam_ruby/models/user_liker"
require "jam_ruby/models/user_like" # require "jam_ruby/models/user_like"
require "jam_ruby/models/user_follower" # require "jam_ruby/models/user_follower"
require "jam_ruby/models/user_following" # require "jam_ruby/models/user_following"
require "jam_ruby/models/search" require "jam_ruby/models/search"
require "jam_ruby/models/recording" require "jam_ruby/models/recording"
require "jam_ruby/models/recording_comment" require "jam_ruby/models/recording_comment"
require "jam_ruby/models/recording_liker" # require "jam_ruby/models/recording_liker"
require "jam_ruby/models/recording_play" require "jam_ruby/models/recording_play"
require "jam_ruby/models/recorded_track" require "jam_ruby/models/recorded_track"
require "jam_ruby/models/recorded_track_observer" require "jam_ruby/models/recorded_track_observer"

View File

@ -50,6 +50,10 @@ module JamRuby
return self.likers.size return self.likers.size
end end
# def likes?(user)
# self.likers.exists?(user)
# end
def follower_count def follower_count
return self.followers.size return self.followers.size
end end

View File

View File

@ -0,0 +1,8 @@
module JamRuby
class Like < ActiveRecord::Base
belongs_to :liker, :class_name => "JamRuby::User", :foreign_key => "liker_id"
belongs_to :likable, :polymorphic => true
end
end

View File

@ -43,35 +43,41 @@ module JamRuby
has_many :claimed_recordings, :class_name => "JamRuby::ClaimedRecording", :inverse_of => :user has_many :claimed_recordings, :class_name => "JamRuby::ClaimedRecording", :inverse_of => :user
has_many :playing_claimed_recordings, :class_name => "JamRuby::MusicSession", :inverse_of => :claimed_recording_initiator has_many :playing_claimed_recordings, :class_name => "JamRuby::MusicSession", :inverse_of => :claimed_recording_initiator
# user likers (a musician has likers and may have likes too; fans do not have likers) has_many :likes, :as => :likable
has_many :likers, :class_name => "JamRuby::UserLiker", :foreign_key => "user_id", :inverse_of => :user
has_many :inverse_likers, :through => :likers, :class_name => "JamRuby::User", :foreign_key => "liker_id"
# user likes (fans and musicians have likes) # # user likers (users who like current_user)
has_many :likes, :class_name => "JamRuby::UserLike", :foreign_key => "liker_id", :inverse_of => :user # has_many :likers, :class_name => "JamRuby::UserLiker", :foreign_key => "user_id", :inverse_of => :user
has_many :inverse_likes, :through => :likes, :class_name => "JamRuby::User", :foreign_key => "user_id" # has_many :inverse_likers, :through => :likers, :class_name => "JamRuby::User", :foreign_key => "liker_id"
# band likes # # user likes (users who current_user likes)
has_many :band_likes, :class_name => "JamRuby::BandLiker", :foreign_key => "liker_id", :inverse_of => :user # has_many :likes, :class_name => "JamRuby::UserLike", :foreign_key => "liker_id", :inverse_of => :user
has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id" # has_many :inverse_likes, :through => :likes, :class_name => "JamRuby::User", :foreign_key => "user_id"
# followers # # band likes
has_many :user_followers, :class_name => "JamRuby::UserFollower", :foreign_key => "user_id" # has_many :band_likes, :class_name => "JamRuby::BandLiker", :foreign_key => "liker_id", :inverse_of => :user
has_many :followers, :through => :user_followers, :class_name => "JamRuby::User" # has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id"
has_many :inverse_user_followers, :through => :followers, :class_name => "JamRuby::UserFollower", :foreign_key => "follower_id"
has_many :inverse_followers, :through => :inverse_user_followers, :source => :user, :class_name => "JamRuby::User"
# user followings # # session likes
has_many :user_followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "follower_id" # has_many :session_likes, :class_name => "JamRuby::SessionLiker", :foreign_key => "liker_id", :inverse_of => :user
has_many :followings, :through => :user_followings, :class_name => "JamRuby::User" # has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id"
has_many :inverse_user_followings, :through => :followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "user_id"
has_many :inverse_followings, :through => :inverse_user_followings, :source => :user, :class_name => "JamRuby::User"
# band followings # # followers
has_many :b_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "follower_id" # has_many :user_followers, :class_name => "JamRuby::UserFollower", :foreign_key => "user_id"
has_many :band_followings, :through => :b_followings, :class_name => "JamRuby::Band" # has_many :followers, :through => :user_followers, :class_name => "JamRuby::User"
has_many :inverse_b_followings, :through => :band_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "band_id" # has_many :inverse_user_followers, :through => :followers, :class_name => "JamRuby::UserFollower", :foreign_key => "follower_id"
has_many :inverse_band_followings, :through => :inverse_band_followings, :source => :band, :class_name => "JamRuby::Band" # has_many :inverse_followers, :through => :inverse_user_followers, :source => :user, :class_name => "JamRuby::User"
# # user followings
# has_many :user_followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "follower_id"
# has_many :followings, :through => :user_followings, :class_name => "JamRuby::User"
# has_many :inverse_user_followings, :through => :followings, :class_name => "JamRuby::UserFollowing", :foreign_key => "user_id"
# has_many :inverse_followings, :through => :inverse_user_followings, :source => :user, :class_name => "JamRuby::User"
# # band followings
# has_many :b_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "follower_id"
# has_many :band_followings, :through => :b_followings, :class_name => "JamRuby::Band"
# has_many :inverse_b_followings, :through => :band_followings, :class_name => "JamRuby::BandFollowing", :foreign_key => "band_id"
# has_many :inverse_band_followings, :through => :inverse_band_followings, :source => :band, :class_name => "JamRuby::Band"
# notifications # notifications
has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "target_user_id" has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "target_user_id"
@ -254,17 +260,31 @@ module JamRuby
return self.friends.size return self.friends.size
end end
def liker_count # check if "user" likes "this user"
return self.likers.size # def likers?(user)
end # return self.likers.exists?(user)
# end
# def liker_count
# return self.likers.size
# end
# check if "this user" likes "user"
# def likes?(user)
# return self.likes.where("EXISTS(SELECT 1 FROM")
# end
def like_count def like_count
return self.likes.size return self.likes.size
end end
def band_like_count # def likes_band(band)
return self.band_likes.size # return self.band_likes.exists?(band)
end # end
# def band_like_count
# return self.band_likes.size
# end
def following?(user) def following?(user)
self.followings.exists?(user) self.followings.exists?(user)
@ -278,6 +298,14 @@ module JamRuby
return self.followings.size return self.followings.size
end end
def following_band?(band)
self.band_followings.exists?(band)
end
# def likes_band?(band)
# self.band_likes.exists?(band)
# end
def band_following_count def band_following_count
return self.band_followings.size return self.band_followings.size
end end

View File

@ -3,24 +3,26 @@ object @band
attributes :id, :name, :city, :state, :country, :location, :website, :biography, :photo_url, :logo_url, :liker_count, :follower_count, :recording_count, :session_count, attributes :id, :name, :city, :state, :country, :location, :website, :biography, :photo_url, :logo_url, :liker_count, :follower_count, :recording_count, :session_count,
:original_fpfile_photo, :cropped_fpfile_photo, :crop_selection_photo :original_fpfile_photo, :cropped_fpfile_photo, :crop_selection_photo
unless @band.users.blank? child :users => :musicians do
child :users => :musicians do attributes :id, :first_name, :last_name, :name, :photo_url
attributes :id, :first_name, :last_name, :name, :photo_url
# TODO: figure out how to omit empty arrays # TODO: figure out how to omit empty arrays
node :instruments do |user| node :instruments do |user|
unless user.instruments.nil? || user.instruments.size == 0 unless user.instruments.nil? || user.instruments.size == 0
child :musician_instruments => :instruments do child :musician_instruments => :instruments do
attributes :instrument_id, :description, :proficiency_level, :priority attributes :instrument_id, :description, :proficiency_level, :priority
end
end end
end end
end end
end end
unless @band.genres.blank? child :genres => :genres do
child :genres => :genres do attributes :id, :description
attributes :id, :description #partial('api_genres/index', :object => @band.genres)
#partial('api_genres/index', :object => @band.genres)
end
end end
if current_user
node :is_following do |uu|
current_user.following_band?(@band)
end
end

View File

@ -19,6 +19,7 @@ elsif current_user
node :is_following do |uu| node :is_following do |uu|
current_user.following?(@user) current_user.following?(@user)
end end
node :
end end
child :friends => :friends do child :friends => :friends do

View File

@ -48,7 +48,7 @@ SampleApp::Application.configure do
config.assets.debug = false config.assets.debug = false
# Set the logging destination(s) # Set the logging destination(s)
config.log_to = %w[stdout file] # config.log_to = %w[stdout file]
# Show the logging configuration on STDOUT # Show the logging configuration on STDOUT
config.show_log_configuration = true config.show_log_configuration = true