Ruby on rails 最好的重构方法,而不必像我这样多次调用?

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

我正试着在这些街区中穿行。他们基本上缩小了满足一系列属性的人数

如果这看起来真的很混乱,我很抱歉,但我的数据库在处理这件事上确实付出了代价,我知道有更好的方法。我现在对战略迷茫了

我的代码:

分布的def计数

#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