0

私は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
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}

これは s の配列を生成emp_idします (私は整数を想定しています)。

(整数の配列)destroy_allを含むマップが渡されると、基本的に、結果セットに対するthen 呼び出しを使用してすべてのレコードを検索します。:emp_id =>wheredestroy_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 に答える