models/user.rb
class User < Sequel::Model
include Shield::Model
one_to_many :chists
one_to_many :user_api_keys
ALLOWED_PROVIDERS = [:facebook, :twitter, :github]
@@sel_ds = self.db[:user_favorites].where(:user_id => :$u, :chist_id => :$c)
@@ins_ds = self.db["INSERT INTO user_favorites (user_id, chist_id) VALUES (?, ?)", :$u, :$c]
@@del_ds = self.db["DELETE FROM user_favorites WHERE user_id = ? AND chist_id = ?", :$u, :$c]
def before_destroy
self.user_api_keys.map(&:destroy)
super
end
def self.fetch(email)
find(:email => email)
end
def activate
self.valid = true #use self to avoid collition
validation_code = ""
save
end
def has_provider?(provider)
!self.send("#{provider}_user").nil?
end
def add_provider(provider, user_id)
return false unless ALLOWED_PROVIDERS.include? provider.to_sym
self.update(:"#{provider}_user" => user_id)
end
def latest_chists
Chist.where(:user_id => self.id).order(Sequel.desc(:created_at)).limit(4)
end
def favorited?(chist)
@@sel_ds.call(:select, :u => self.id, :c => chist.id).any?
end
def toggle_favorite(chist)
if self.favorited?(chist)
puts @@del_ds.call(:delete, :u => self.id, :c => chist.id)
else
@@ins_ds.call(:insert, :u => self.id, :c => chist.id)
end
end
def search_chists(query)
Chist.where("user_id = ? AND (chist ILIKE ? OR title ILIKE ?)", self.id, "%#{query}%", "%#{query}%")
end
def favorite_chists
Chist.select_all(:chists).join(:user_favorites, :chist_id => :id).where("user_favorites.user_id = ?", self.id).order(Sequel.desc(:created_at))
end
def ordered_chists
favs = favorite_chists
reg_chists = Chist.where("user_id = ?", self.id).order(Sequel.desc(:created_at))
reg_chists = reg_chists.where("id NOT IN ?", favs.map(&:id)) if favs.any?
favs.to_a + reg_chists.to_a
end
end