我正在学习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
答案 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]})