我正在尝试循环使用其中的一些块。他们基本上缩小了许多满足一系列属性的人。
如果这看起来非常混乱我很抱歉,但是我的数据库真的需要对此进行处理,我知道有更好的方法。我现在只是失去了战略。
我的代码:
def count_of_distribution
#beginning with an array..
array_of_users = []
# any matching zip codes? ..
# zip_codes
@zip_codes = self.distributions.map(&:zip_code).compact
unless @zip_codes.nil? || @zip_codes.empty?
@matched_zips = CardSignup.all.map(&:zip_code) & @zip_codes
@matched_zips.each do |mz|
CardSignup.find(:all, :conditions => ["zip_code = ?", mz]).each do |cs|
array_of_users << cs.id
end
end
end
# any matching interests?..
# interest
@topics = self.distributions.map(&:me_topic).compact
unless @topics.nil? || @topics.empty?
@matched_topics = MeTopic.all.map(&:name) & @topics
@matched_topics.each do |mt|
MeTopic.find(:all, :conditions => ["name = ?", mt]).each do |mt2|
mt2.users.each do |u|
array_of_users << u.card_signup.id if u.card_signup
end
end
end
end
# any matching sexes?..
# sex
@sexes = self.distributions.map(&:sex).compact
unless @sexes.nil? || @sexes.empty?
@matched_sexes = CardSignup.all.map(&:sex) & @sexes
@matched_sexes.each do |ms|
CardSignup.find(:all, :conditions => ["sex = ?", ms]).each do |cs|
array_of_users << cs.id
end
end
end
total_number = array_of_users.compact.uniq
return total_number
end
这是迄今为止最令人尴尬的结果:
Completed in 51801ms (View: 43903, DB: 7623) | 200 OK [http://localhost/admin/emails/3/distributions/new]
更新的答案它被截断但仍会对数据库造成巨大损失
array_of_users = []
@zip_codes = self.distributions.map(&:zip_code).compact
@sexes = self.distributions.map(&:sex).compact
@zips_and_sexes = CardSignup.find(:all, :conditions => ["gender IN (?) OR zip_code IN (?)", my_sexes, my_zips])
@zips_and_sexes.each{|cs| array_of_users << cs.id }
@topics = self.distributions.map(&:me_topic).compact
@all_topics = MeTopic.find(:all, :conditions => ["name IN (?)", @topics])
array_of_users << CardSignup.find(:all, :conditions => ["user_id IN (?)", @all_topics.map(&:users)]).map(&:id)
答案 0 :(得分:1)
你试图让rails通过一系列循环来完成所有计算;难怪它花了这么长时间。
很难关注,但可能不是使用.each
循环,而是尝试立即取出所有内容,然后使用.group_by(&:attribute)
或者,如果你的最终结果只是卡片注册。
您似乎正在尝试让所有用户拥有所需的内容,拉链,主题或性别。所以,让数据库完成工作。
my_zips = @zip_codes = self.distributions.map(&:zip_code).compact.join(", ")
my_sexes = @sexes = self.distributions.map(&:sex).compact.join(", ")
all_cards = CardSignup.find(:all, :conditions => ["sex IN (?) OR zip_code IN (?)", my_sexes, my_zips])
my_topics = @topics = self.distributions.map(&:me_topic).compact.join(", ")
all_topics = MeTopic.find(:all, :conditions => ["name = ?", my_topics])
more_cards = all_topics.map{|x| x.users}.map{|n| n.card_signup}
total_number = (all_cards + more_cards).flatten.uniq
我希望这是一个更好的答案。
答案 1 :(得分:0)
在这里。它现在运行得非常快:
array_of_users = []
# zips and sexes
@zip_codes = self.distributions.map(&:zip_code).compact
@sexes = self.distributions.map(&:sex).compact
@zips_and_sexes = CardSignup.find(:all, :conditions => ["gender IN (?) OR zip_code IN (?)", @sexes, @zip_codes])
@zips_and_sexes.each{|cs| array_of_users << cs.id }
# interest
@topics = self.distributions.map(&:me_topic).compact
@selected_topics = MeTopic.find(:all, :conditions => ["name in (?)", @topics]).map(&:id)
@matched_users = ActiveRecord::Base.connection.execute("SELECT * FROM `me_topics_users` WHERE (me_topic_id IN ('#{@selected_topics.join("', '")}') )")
@list_of_user_ids = []
@matched_users.each{|a| @list_of_user_ids << a[0] }
@list_of_user_ids.uniq!
array_of_users << CardSignup.find(:all, :conditions => ["user_id IN (?)", @list_of_user_ids]).map(&:id)
# age
@ages = self.distributions.map(&:age).compact
@ages_array = []
@ages.each{|a| @ages_array << how_old(a) }
@ages_array.each{|aa| array_of_users << aa.id}
array_of_users << CardSignup.all.map(&:id) if array_of_users.flatten.empty?
total_number = array_of_users.flatten.uniq
return total_number