jam-cloud/lib/jam_ruby/models/band.rb

163 lines
4.3 KiB
Ruby
Raw Normal View History

2012-10-01 21:27:32 +00:00
module JamRuby
class Band < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
2012-10-01 21:27:32 +00:00
attr_accessible :name, :website, :biography, :city, :state, :country
2012-11-03 19:32:27 +00:00
2012-10-28 02:35:28 +00:00
self.primary_key = 'id'
2012-10-01 21:27:32 +00:00
# musicians
2012-11-16 02:08:37 +00:00
has_many :band_musicians, :class_name => "JamRuby::BandMusician"
has_many :users, :through => :band_musicians, :class_name => "JamRuby::User"
# genres
has_and_belongs_to_many :genres, :class_name => "JamRuby::Genre", :join_table => "bands_genres"
2012-10-01 21:27:32 +00:00
2012-11-16 02:08:37 +00:00
# recordings
has_many :band_recordings, :class_name => "JamRuby::BandRecording", :foreign_key => "band_id"
has_many :recordings, :through => :band_recordings, :class_name => "JamRuby::Recording"
2012-11-16 02:08:37 +00:00
2012-11-04 22:54:53 +00:00
# followers
has_many :followers, :class_name => "JamRuby::BandFollower", :foreign_key => "band_id"
has_many :inverse_followers, :through => :followers, :source => :user, :class_name => "JamRuby::Band", :foreign_key => "follower_id"
2012-11-24 18:22:44 +00:00
# invitations
has_many :invitations, :inverse_of => :band, :class_name => "JamRuby::BandInvitation", :foreign_key => "band_id"
2012-11-03 19:32:27 +00:00
after_save :limit_to_three_genres
2012-10-29 10:45:47 +00:00
def photo_url
# TODO: move image path to config
@photo_url = "http://www.jamkazam.com/images/bands/photos/#{self.id}.gif"
2012-10-29 10:45:47 +00:00
end
def logo_url
# TODO: move image path to config
@logo_url = "http://www.jamkazam.com/images/bands/logos/#{self.id}.gif"
2012-10-29 10:45:47 +00:00
end
2012-11-06 04:47:50 +00:00
def follower_count
return self.followers.size
end
2012-11-22 08:27:23 +00:00
def location
# TODO: implement a single string version of location;
# this will be indexed into elasticsearch and returned in search
2012-11-16 02:08:37 +00:00
return "#{self.city}, #{self.state}, #{self.country}"
end
# helper method for creating / updating a Band
def self.save(id, name, website, biography, city, state, country, genres)
if id.nil?
2012-11-03 19:32:27 +00:00
band = Band.new()
else
band = Band.find(id)
2012-11-03 19:32:27 +00:00
end
# name
unless name.nil?
band.name = name
2012-11-03 19:32:27 +00:00
end
2012-11-04 22:54:53 +00:00
# website
unless website.nil?
band.website = website
2012-11-24 18:22:44 +00:00
end
2012-11-03 19:32:27 +00:00
2012-11-04 22:54:53 +00:00
# biography
unless biography.nil?
band.biography = biography
2012-11-03 19:32:27 +00:00
end
2012-11-06 02:55:08 +00:00
# city
unless city.nil?
band.city = city
2012-11-06 02:55:08 +00:00
end
# state
unless state.nil?
band.state = state
2012-11-06 02:55:08 +00:00
end
# country
unless country.nil?
band.country = country
2012-11-06 02:55:08 +00:00
end
2012-11-03 19:32:27 +00:00
# genres
unless genres.nil?
ActiveRecord::Base.transaction do
# delete all genres for this band first
unless band.id.nil? || band.id.length == 0
band.genres.delete_all
end
2012-11-04 22:54:53 +00:00
# loop through each genre in the array and save to the db
2012-11-03 19:32:27 +00:00
genres.each do |genre_id|
g = Genre.find(genre_id)
band.genres << g
end
end
end
band.updated_at = Time.now.getutc
band.save
return band
end
2012-11-03 19:32:27 +00:00
def limit_to_three_genres
2012-11-24 18:22:44 +00:00
if self.genres.count > Limits::MAX_GENRES_PER_BAND
errors.add(:genres, ValidationMessages::GENRE_LIMIT_EXCEEDED)
2012-11-03 19:32:27 +00:00
end
end
### Elasticsearch/Tire integration ###
#
# Define the name based on the environment
# We wouldn't like to erase dev data during
# test runs!
#
index_name("#{Environment.mode}-#{Environment.application}-bands")
def to_indexed_json
{
:name => name,
:logo_url => logo_url,
:photo_url => photo_url,
:location => location
}.to_json
end
class << self
def create_search_index
Tire.index(Band.index_name) do
create(
:settings => Search.index_settings,
:mappings => {
"jam_ruby/band" => {
:properties => {
2012-11-22 08:27:23 +00:00
:logo_url => { :type => :string, :index => :not_analyzed, :include_in_all => false },
:photo_url => { :type => :string, :index => :not_analyzed, :include_in_all => false},
:name => { :type => :string, :boost => 100},
:location => { :type => :string },
}
}
}
)
end
end
def delete_search_index
search_index.delete
end
def search_index
Tire.index(Band.index_name)
end
end
### Elasticsearch/Tire integration
2012-10-01 21:27:32 +00:00
end
2012-11-08 04:08:16 +00:00
end