fixed user tests

This commit is contained in:
albert
2011-06-05 04:05:21 -04:00
parent ca3e9bb6db
commit 435d3bf6e2
9 changed files with 5491 additions and 281 deletions

View File

@@ -1,95 +0,0 @@
class Favorite
attr_accessor :attributes, :errors
def self.table_name_for(user_id)
"favorites_#{user_id.to_i % 10}"
end
def self.sql_order_clause(post_ids, posts_table_alias = "posts")
if post_ids.empty?
return "#{posts_table_alias}.id desc"
end
conditions = []
post_ids.each_with_index do |post_id, n|
conditions << "when #{post_id} then #{n}"
end
"case #{posts_table_alias}.id " + conditions.join(" ") + " end"
end
def self.create(attributes)
user_id = attributes[:user_id]
post_id = attributes[:post_id]
execute_sql("INSERT INTO #{table_name_for(user_id)} (user_id, post_id) VALUES (?, ?)", user_id, post_id)
rescue ActiveRecord::RecordNotUnique
# ignore
end
def self.count(user_id)
select_value_sql("SELECT COUNT(*) FROM #{table_name_for(user_id)}").to_i
end
def self.destroy(conditions)
if conditions[:user_id] && conditions[:post_id]
destroy_for_post_and_user(conditions[:post_id], conditions[:user_id])
elsif conditions[:user_id]
destroy_for_user(conditions[:user_id])
elsif conditions[:post_id]
destroy_for_post(conditions[:post_id])
end
end
def self.find_post_ids(user_id, options)
limit = options[:limit] || 1 || Danbooru.config.posts_per_page
if options[:before_id]
select_values_sql("SELECT post_id FROM #{table_name_for(user_id)} WHERE id < ? ORDER BY id DESC LIMIT ?", options[:before_id], limit)
elsif options[:after_id]
select_values_sql("SELECT post_id FROM #{table_name_for(user_id)} WHERE id > ? ORDER BY id ASC LIMIT ?", options[:after_id], limit).reverse
elsif options[:offset]
select_values_sql("SELECT post_id FROM #{table_name_for(user_id)} ORDER BY id DESC LIMIT ? OFFSET ?", limit, options[:offset])
else
select_values_sql("SELECT post_id FROM #{table_name_for(user_id)} ORDER BY id DESC LIMIT ?", limit)
end
end
def self.exists?(conditions)
if conditions[:user_id] && conditions[:post_id]
select_value_sql("SELECT 1 FROM #{table_name_for(conditions[:user_id])} WHERE user_id = ? AND post_id = ?", conditions[:user_id], conditions[:post_id])
elsif conditions[:user_id]
select_value_sql("SELECT 1 FROM #{table_name_for(conditions[:user_id])} WHERE user_id = ?", conditions[:user_id])
elsif conditions[:post_id]
select_value_sql("SELECT 1 FROM #{table_name_for(conditions[:user_id])} WHERE post_id = ?", conditions[:post_id])
else
false
end
end
def self.destroy_for_post_and_user(post_id, user_id)
execute_sql("DELETE FROM #{table_name_for(user_id)} WHERE post_id = #{post_id} AND user_id = #{user_id}")
end
def self.destroy_for_post(post)
0.upto(9) do |i|
execute_sql("DELETE FROM favorites_#{i} WHERE post_id = #{post.id}")
end
end
def self.destroy_for_user(user)
execute_sql("DELETE FROM #{table_name_for(user)} WHERE user_id = #{user.id}")
end
def self.select_value_sql(sql, *params)
ActiveRecord::Base.select_value_sql(sql, *params)
end
def self.select_values_sql(sql, *params)
ActiveRecord::Base.select_values_sql(sql, *params)
end
def self.execute_sql(sql, *params)
ActiveRecord::Base.execute_sql(sql, *params)
end
end

20
app/models/favorite.rb Normal file
View File

@@ -0,0 +1,20 @@
class Favorite < ActiveRecord::Base
TABLE_COUNT = 100
validates_uniqueness_of :post_id, :scope => :user_id
def self.model_for(user_id)
mod = user_id % TABLE_COUNT
Object.const_get("Favorite#{mod}")
end
def self.delete_post(post_id)
0.upto(TABLE_COUNT - 1) do |i|
model_for(i).destroy_all(:post_id => post_id)
end
end
end
0.upto(Favorite::TABLE_COUNT - 1) do |i|
Object.const_set("Favorite#{i}", Class.new(Favorite))
Object.const_get("Favorite#{i}").set_table_name("favorites_#{i}")
end

View File

@@ -373,13 +373,17 @@ class Post < ActiveRecord::Base
module FavoriteMethods
def delete_favorites
Favorite.destroy_for_post(self)
Favorite.delete_post(id)
end
def favorited_by?(user_id)
fav_string =~ /(?:\A| )fav:#{user_id}(?:\Z| )/
end
def append_user_to_fav_string(user_id)
update_attribute(:fav_string, (fav_string + " fav:#{user_id}").strip)
end
def add_favorite(user_id)
if user_id.is_a?(ActiveRecord::Base)
user_id = user_id.id
@@ -389,10 +393,13 @@ class Post < ActiveRecord::Base
return false
end
self.fav_string += " fav:#{user_id}"
self.fav_string.strip!
update_attribute(:fav_string, fav_string)
Favorite.create(:user_id => user_id, :post_id => id)
append_user_to_fav_string(user_id)
Favorite.model_for(user_id).create(:user_id => user_id, :post_id => id)
end
def delete_user_from_fav_string(user_id)
update_attribute(:fav_string, fav_string.gsub(/(?:\A| )fav:#{user_id}(?:\Z| )/, " ").strip)
end
def remove_favorite(user_id)
@@ -400,10 +407,9 @@ class Post < ActiveRecord::Base
user_id = user_id.id
end
self.fav_string.gsub!(/(?:\A| )fav:#{user_id}(?:\Z| )/, " ")
self.fav_string.strip!
update_attribute(:fav_string, fav_string)
Favorite.destroy(:user_id => user_id, :post_id => id)
delete_user_from_fav_string(user_id)
Favorite.model_for(user_id).destroy_all(:user_id => user_id, :post_id => id)
end
def favorited_user_ids
@@ -780,10 +786,6 @@ class Post < ActiveRecord::Base
remove_favorite(user_id)
end
end
def delete_favorites
Favorite.destroy_for_post(self)
end
end
module DeletionMethods

View File

@@ -118,12 +118,7 @@ class User < ActiveRecord::Base
module FavoriteMethods
def favorites(options = {})
post_ids = Favorite.find_post_ids(id, options)
if post_ids.any?
Post.where("id in (?)", post_ids).order(Favorite.sql_order_clause(post_ids))
else
Post.where("false")
end
Favorite.model_for(id).where("user_id = ?", id)
end
end
@@ -212,7 +207,7 @@ class User < ActiveRecord::Base
elsif created_at > 1.week.ago
false
else
Comment.where("creator_id = ? and created_at > ?", id, 1.hour.ago).count <= Danbooru.config.member_comment_limit
Comment.where("creator_id = ? and created_at > ?", id, 1.hour.ago).count < Danbooru.config.member_comment_limit
end
end