added favorite unit tests
This commit is contained in:
@@ -1,2 +1,13 @@
|
||||
class Favorite < ActiveRecord::Base
|
||||
class Favorite
|
||||
def self.table_name_for(user)
|
||||
"favorites_#{user.id % 10}"
|
||||
end
|
||||
|
||||
def self.create(user, post)
|
||||
ActiveRecord::Base.connection.execute("INSERT INTO #{table_name_for(user)} (user_id, post_id) VALUES (#{user.id}, #{post.id})")
|
||||
end
|
||||
|
||||
def self.destroy(user, post)
|
||||
ActiveRecord::Base.connection.execute("DELETE FROM #{table_name_for(user)} WHERE user_id = #{user.id} AND post_id = #{post.id}")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,6 +3,7 @@ class Pool < ActiveRecord::Base
|
||||
validates_presence_of :name
|
||||
validates_format_of :name, :with => /\A[^\s;,]+\Z/, :on => :create, :message => "cannot have whitespace, commas, or semicolons"
|
||||
belongs_to :creator, :class_name => "User"
|
||||
has_many :versions, :class_name => "PoolVersion"
|
||||
|
||||
def self.create_anonymous(creator)
|
||||
pool = Pool.create(:name => "TEMP - #{Time.now.to_f}.#{rand(1_000_000)}", :creator => creator)
|
||||
|
||||
6
app/models/pool_version.rb
Normal file
6
app/models/pool_version.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class PoolVersion < ActiveRecord::Base
|
||||
class Error < Exception ; end
|
||||
|
||||
validates_presence_of :updater_id, :updater_ip_addr
|
||||
belongs_to :pool
|
||||
end
|
||||
@@ -221,11 +221,13 @@ class Post < ActiveRecord::Base
|
||||
def add_favorite(user)
|
||||
self.fav_string += " fav:#{user.name}"
|
||||
self.fav_string.strip!
|
||||
Favorite.create(user, self)
|
||||
end
|
||||
|
||||
def remove_favorite(user)
|
||||
self.fav_string.gsub!(/fav:#{user.name}\b\s*/, " ")
|
||||
self.fav_string.strip!
|
||||
Favorite.destroy(user, self)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -2,4 +2,5 @@ class PostVersion < ActiveRecord::Base
|
||||
class Error < Exception ; end
|
||||
|
||||
validates_presence_of :updater_id, :updater_ip_addr
|
||||
belongs_to :post
|
||||
end
|
||||
|
||||
@@ -71,8 +71,30 @@ class User < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
|
||||
module FavoriteMethods
|
||||
def favorite_posts(options = {})
|
||||
favorites_table = Favorite.table_name_for(self)
|
||||
before_id = options[:before]
|
||||
before_id_sql_fragment = "AND favorites.id < #{before_id.to_i}" if before_id
|
||||
limit = options[:limit] || 20
|
||||
|
||||
sql = <<-EOS
|
||||
SELECT posts.*, favorites.id AS favorite_id
|
||||
FROM posts
|
||||
JOIN #{favorites_table} AS favorites ON favorites.post_id = posts.id
|
||||
WHERE
|
||||
favorites.user_id = #{id}
|
||||
#{before_id_sql_fragment}
|
||||
ORDER BY favorite_id DESC
|
||||
LIMIT #{limit.to_i}
|
||||
EOS
|
||||
Post.find_by_sql(sql)
|
||||
end
|
||||
end
|
||||
|
||||
include NameMethods
|
||||
include PasswordMethods
|
||||
extend AuthenticationMethods
|
||||
include FavoriteMethods
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user