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

@ -107,3 +107,4 @@ recordings_all_discarded.sql
recordings_via_admin_web.sql
relax_band_model_varchar.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/artifact_update"
require "jam_ruby/models/band_invitation"
require "jam_ruby/models/band_liker"
require "jam_ruby/models/band_follower"
require "jam_ruby/models/band_following"
# require "jam_ruby/models/band_liker"
# require "jam_ruby/models/band_follower"
# require "jam_ruby/models/band_following"
require "jam_ruby/models/band_musician"
require "jam_ruby/models/connection"
require "jam_ruby/models/friendship"
require "jam_ruby/models/music_session"
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_user_history"
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/friend_request"
require "jam_ruby/models/instrument"
require "jam_ruby/models/like"
require "jam_ruby/models/musician_instrument"
require "jam_ruby/models/notification"
require "jam_ruby/models/track"
require "jam_ruby/models/user_liker"
require "jam_ruby/models/user_like"
require "jam_ruby/models/user_follower"
require "jam_ruby/models/user_following"
# require "jam_ruby/models/user_liker"
# require "jam_ruby/models/user_like"
# require "jam_ruby/models/user_follower"
# require "jam_ruby/models/user_following"
require "jam_ruby/models/search"
require "jam_ruby/models/recording"
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/recorded_track"
require "jam_ruby/models/recorded_track_observer"

View File

@ -50,6 +50,10 @@ module JamRuby
return self.likers.size
end
# def likes?(user)
# self.likers.exists?(user)
# end
def follower_count
return self.followers.size
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 :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 :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"
has_many :likes, :as => :likable
# user likes (fans and musicians have likes)
has_many :likes, :class_name => "JamRuby::UserLike", :foreign_key => "liker_id", :inverse_of => :user
has_many :inverse_likes, :through => :likes, :class_name => "JamRuby::User", :foreign_key => "user_id"
# # user likers (users who like current_user)
# 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"
# band likes
has_many :band_likes, :class_name => "JamRuby::BandLiker", :foreign_key => "liker_id", :inverse_of => :user
has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id"
# # user likes (users who current_user likes)
# has_many :likes, :class_name => "JamRuby::UserLike", :foreign_key => "liker_id", :inverse_of => :user
# has_many :inverse_likes, :through => :likes, :class_name => "JamRuby::User", :foreign_key => "user_id"
# followers
has_many :user_followers, :class_name => "JamRuby::UserFollower", :foreign_key => "user_id"
has_many :followers, :through => :user_followers, :class_name => "JamRuby::User"
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"
# # band likes
# has_many :band_likes, :class_name => "JamRuby::BandLiker", :foreign_key => "liker_id", :inverse_of => :user
# has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id"
# 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"
# # session likes
# has_many :session_likes, :class_name => "JamRuby::SessionLiker", :foreign_key => "liker_id", :inverse_of => :user
# has_many :inverse_band_likes, :through => :band_likes, :class_name => "JamRuby::Band", :foreign_key => "band_id"
# 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"
# # followers
# has_many :user_followers, :class_name => "JamRuby::UserFollower", :foreign_key => "user_id"
# has_many :followers, :through => :user_followers, :class_name => "JamRuby::User"
# 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
# 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
has_many :notifications, :class_name => "JamRuby::Notification", :foreign_key => "target_user_id"
@ -254,17 +260,31 @@ module JamRuby
return self.friends.size
end
def liker_count
return self.likers.size
end
# check if "user" likes "this user"
# def likers?(user)
# 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
return self.likes.size
end
def band_like_count
return self.band_likes.size
end
# def likes_band(band)
# return self.band_likes.exists?(band)
# end
# def band_like_count
# return self.band_likes.size
# end
def following?(user)
self.followings.exists?(user)
@ -278,6 +298,14 @@ module JamRuby
return self.followings.size
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
return self.band_followings.size
end

View File

@ -3,7 +3,6 @@ object @band
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
unless @band.users.blank?
child :users => :musicians do
attributes :id, :first_name, :last_name, :name, :photo_url
@ -16,11 +15,14 @@ unless @band.users.blank?
end
end
end
end
unless @band.genres.blank?
child :genres => :genres do
attributes :id, :description
#partial('api_genres/index', :object => @band.genres)
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|
current_user.following?(@user)
end
node :
end
child :friends => :friends do

View File

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