0

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

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

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

请指教一个ruby noob..谢谢!

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
4

1 回答 1

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_ids 数组(我假设是整数)。

destroy_all传递一个包含:emp_id =>(整数数组)的映射时,它基本上使用结果集上的wherethen 调用来搜索所有记录: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]})
于 2013-03-12T03:31:22.307 回答