follow/like refactor to use polymorphic associations
This commit is contained in:
parent
865d8c17b6
commit
5a03ec87ae
|
|
@ -106,4 +106,5 @@ track_connection_id_not_null.sql
|
|||
recordings_all_discarded.sql
|
||||
recordings_via_admin_web.sql
|
||||
relax_band_model_varchar.sql
|
||||
add_piano.sql
|
||||
add_piano.sql
|
||||
like_follower_poly_assoc.sql
|
||||
|
|
@ -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)
|
||||
);
|
||||
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
: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
|
||||
child :users => :musicians do
|
||||
attributes :id, :first_name, :last_name, :name, :photo_url
|
||||
|
||||
# TODO: figure out how to omit empty arrays
|
||||
node :instruments do |user|
|
||||
unless user.instruments.nil? || user.instruments.size == 0
|
||||
child :musician_instruments => :instruments do
|
||||
attributes :instrument_id, :description, :proficiency_level, :priority
|
||||
end
|
||||
# TODO: figure out how to omit empty arrays
|
||||
node :instruments do |user|
|
||||
unless user.instruments.nil? || user.instruments.size == 0
|
||||
child :musician_instruments => :instruments do
|
||||
attributes :instrument_id, :description, :proficiency_level, :priority
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
unless @band.genres.blank?
|
||||
child :genres => :genres do
|
||||
attributes :id, :description
|
||||
#partial('api_genres/index', :object => @band.genres)
|
||||
end
|
||||
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
|
||||
|
|
@ -19,6 +19,7 @@ elsif current_user
|
|||
node :is_following do |uu|
|
||||
current_user.following?(@user)
|
||||
end
|
||||
node :
|
||||
end
|
||||
|
||||
child :friends => :friends do
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue