Destroy_all方法使用混乱

时间:2013-03-12 03:21:34

标签: ruby-on-rails ruby

我正在学习ruby,正在研究在ruby脚本中使用活动记录的代码库。我不明白“&”的使用在puts命令之后的.collect语句中:“删除已终止的员工”。 Terminated_ids是什么类型的数据结构?

destroy_all方法可以采用这种数据结构吗?不知道用怪异的&符号收集命令是什么?

我想使用destory_all终止员工ID列表。但我的数据结构是如下的哈希:[{:emp_id=> "2637"},{:emp_id=> "2637"},{:emp_id=> "2637"},{:emp_id=> "2637"}]

请指教一个红宝石菜鸟..谢谢!

class  Maker < ActiveRecord::Base
  host = 'superman.com'
  port = 2000
  sid  = 'ASID'

Maker.establish_connection(
    :adapter  => 'oracle_enhanced',
    :database => "someDB",
    :username => 'user',
    :password => 'passer'
  )
  set_table_name 'WORK.EMPS'
end


puts 'removing terminated employees'
Terminated_ids = Maker.where('term_date IS NOT NULL').collect(&:emp_id) # ???
OtherModel.destroy_all(:emp_id => Terminated_ids)

puts 'removing employees who have been deleted'
OtherModel.find_each do |othermodel|
  if othermodel.email[-12,12] != '@ahsmsweh.com' #do not remove employees with an @ahsmsweh.com email
    pbx_record = Maker.find_by_emp_id(othermodel.emp_id)
    if pbx_record.nil?
      puts "destroying missing record for #{othermodel.email}"
      othermodel.destroy
    end
  end
end

1 个答案:

答案 0 :(得分:0)

这是一个捷径:

enumerable.collect(symbol.to_proc)

其行为与:

相同
enumerable.collect {|element| element.send(symbol)}

或者,在您的具体案例中:

Maker.where('term_date IS NOT NULL').collect {|m| m.emp_id}

产生一个emp_id s数组(我假设是整数)。

destroy_all传递包含:emp_id =>(整数数组)的地图时,它基本上使用where搜索所有记录,然后在结果集上调用destroy_all

where(:emp_id => [...]).destroy_all

对于包含[{:emp_id=> "123"},{:emp_id=> "456"}, ...]的哈希数组,您可以使用相同的技术“折叠”它们:

a = [{:emp_id=> "123"},{:emp_id=> "456"}, ...]

OtherModel.destroy_all(:emp_id => a.map(&:values).(&:first))

当然,虽然可读,但我更喜欢更简单:

OtherModel.destroy_all(:emp_id => a.map {|h| h[:emp_id]})