Ruby on rails 最好的重构方法,而不必像我这样多次调用?
我正试着在这些街区中穿行。他们基本上缩小了满足一系列属性的人数 如果这看起来真的很混乱,我很抱歉,但我的数据库在处理这件事上确实付出了代价,我知道有更好的方法。我现在对战略迷茫了 我的代码: 分布的def计数Ruby on rails 最好的重构方法,而不必像我这样多次调用?,ruby-on-rails,ruby,arrays,activerecord,refactoring,Ruby On Rails,Ruby,Arrays,Activerecord,Refactoring,我正试着在这些街区中穿行。他们基本上缩小了满足一系列属性的人数 如果这看起来真的很混乱,我很抱歉,但我的数据库在处理这件事上确实付出了代价,我知道有更好的方法。我现在对战略迷茫了 我的代码: 分布的def计数 #beginning with an array.. array_of_users = [] # any matching zip codes? .. # zip_codes @zip_codes = self.distributions.map(&:zip_code).comp
#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
更新的答案它被截断了,但仍然对数据库造成了巨大的损失
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)
您试图让rails通过一系列循环完成所有计算;难怪要花这么长时间 这很难理解,但可能不是使用.each循环,而是尝试立即提取所需的所有内容,然后使用.group\u by&:属性 或者,如果你的最终结果只是卡注册 你似乎在试图让所有的用户都有自己想要的东西,一个zip,一个主题,或者一个sex。所以,让数据库来完成这项工作 my_zips=@zip_code=self.distributions.map&:zip_code.compact.join, my_Leverses=@leverses=self.distributions.map&:sex.compact.join all_cards=CardSignup.find:all,:conditions=>[性别输入或邮政编码输入,我的性别,我的拉链] my_topics=@topics=self.distributions.map&:me_topic.compact.join, 所有主题=主题。查找:所有,:条件=>[name=?,我的主题] more|cards=all|u topics.map{x|x.users}.map{n|n.card|u signup} 总数=所有卡片+更多卡片。展平。uniq
我希望这是一个更好的答案。给你。它现在运行得非常快:
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
哦,太酷了,从没听说过!ThanksHow会不会节省计算时间?你想要的最终结果到底是什么?分发是选择要发送电子邮件的特征。当人们注册订阅时,他们会选择自己的特征。我正在尝试将分布中选择的特征与CardSignups@Trip通过发布数据库模式和一些示例数据,以及您试图实现的查询结果,您可能会获得更好的结果。是的,我想我错过了您想要的结果。
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