0

Rails で作成した新しいアプリケーションへのアクセスを使用して、古いアプリケーションからいくつかのデータをプッシュする必要があります。Access データを .xls にエクスポートし、 gem でアクセスしましたroo

それはかなりうまく動作し、スクリプトを作成し、結果を出力することで、すべて適切に実行されると確信しています.Railsアプリケーションモデルにアクセスして、データベース内にこのデータを自動的に挿入したいと思います.

このファイルを自分の rails のlib/ディレクトリの下に置いてみたところ、ファイル内で必要になりましたenvironments/development.rbが、ruby ファイルをインポートすると、処理が必要な変数が見つからないと表示されます。

完全を期すために、これは、xls からデータを抽出し、新しいデータベース スキーマに一致するように編集するために開発したソース コード全体です。

# encoding: utf-8

require 'rubygems'
require 'roo'

user_id_conversion = {119 => 10, 152 => 11, 145 => 12, 161 => 13, 163 => 14, 158 => 15}
conversion_hours = {15 => 14, 17 => 16, 19 => 18}
hostess_id_conversion = {139 => 9, 157 => 17, 153 => 18, 110 => 20, 40 => 19, 141 => 21, 121 => 22, 151 => 23}
status_conversion = {1 => "Inserito", 2 => "Rifiutato", 3 => "Visitato", 4 => "Inserito", 5 => "Ricontattare", 6 => "Vendita"}
mall_id_conversion = {51 => 1, 56 => 2, 53 => 3, 54 => 4, 59 => 5, 65 => 6}

xls = Excel.new("/home/lex/Scrivania/appointments.xls")
xls.default_sheet = xls.sheets.first

city_list = []

# change this to current row numbers
1.upto(3829) do |line|
  uid        = xls.cell(line,'B').to_i

  if user_id_conversion.has_key? uid
    id         = xls.cell(line, 'A')
    uid        = user_id_conversion[uid]
    name       = xls.cell(line, 'F')
    surname    = xls.cell(line, 'E')
    city       = xls.cell(line, 'O')
    street     = xls.cell(line, 'G')
    start_at   = xls.cell(line, 'C')
    start_time = xls.cell(line, 'D')/60/60
    street_no  = xls.cell(line, 'M')
    telephone  = xls.cell(line, 'H')
    mobile     = xls.cell(line, 'I')
    email      = xls.cell(line, 'J')
    notes      = xls.cell(line, 'L')
    agent_note = xls.cell(line, 'U')
    status     = xls.cell(line, 'S')
    signed_by  = xls.cell(line, 'P')
    mall       = xls.cell(line, 'T')

    # we only want to move May -> future
    if start_at.month >= Date.today.month
      ##
      # COMPATIBILITY MODE
      ##
      if conversion_hours.has_key? start_time
        compatibility = true
      else
        compatibility = false
      end

      ##
      # WHO SIGNED THAT APPOINTMENT?
      ##
      if hostess_id_conversion.has_key? signed_by
        signed_by = hostess_id_conversion[signed_by]
      elsif user_id_conversion.has_key? signed_by
        signed_by = user_id_conversion[signed_by]
      else
        signed_by = -1 # display "user deleted"
      end

      ##
      # APPOINTMENT OR EXCLUDED FIELD?
      ##
      available = true
      if status == 4
        available = false
      end
      status = status_conversion[status]

      ##
      # todo SELECT CITY ID FROM DATABASE
      ##
      # city = Municipality.find_by_name(city)
      #

      ##
      # CONVERT MALL_ID
      ##
      if mall_id_conversion.has_key? mall
        mall = mall_id_conversion[mall]
      else
        mall = nil
      end

      ##
      # EMAIL is REQUIRED
      ##
      no_email = false
      if email.blank?
        no_email = true
      end

      ##
      # CONVERT APPOINTMENT DATES TO NEW ONES
      ##
      if compatibility
        old_start_at = DateTime.new start_at.year, start_at.month, start_at.day, start_time
        start_at     = DateTime.new start_at.year, start_at.month, start_at.day, conversion_hours[start_time]
      else
        old_start_at = nil
        start_at     = DateTime.new start_at.year, start_at.month, start_at.day, start_time
      end

      ##
      # todo interesting products
      #    serramenti: boolean, tende_sole: boolean, tecnic: boolean,
      #    tende_veranda: boolean, porte_interne: boolean, tapparelle: boolean, blindati: boolean,
      #    zanzariere: boolean,
      ##

      ##
      # todo INSERT THIS APPOINTMENT
      ##
=begin
      if available == false
        Event.new(
          :event_calendar_id => User.find(uid).event_calendar,
          :status => "Inserito",
          :available => false
          )
      else
        Event.new(
          :event_calendar_id => User.find(uid).event_calendar,
          :signed_by_id => User.find_by_id(signed_by),
          :mall_id => Mall.find_by_id(mall),
          :status => status,
          :name => name,
          :surname => surname,
          :street => street,
          :street_no => street_no,
          :city_id => city.name,
          :telephone => telephone,
          :mobile => mobile,
          :email => email,
          :no_email => no_email,
          :inserting_notes => notes,
          :seller_notes => agent_note,
          :start_at => start_at,
          :available => true,
          group_id: 3,
          :compatibility_start_at => old_start_at
          )
      end
=end

    end
  end
end

Rails環境内でこれを機能させるにはどうすればよいですか? コンソール内で実行されるクラスまたは関数のようなものを作成することを考えていましたrails c。これは、最新のデータベース バージョンを取得し、更新されたレコードで xls を抽出して魔法を実行するために今晩実行する必要があるためです。

これが初心者の質問のように思えるかもしれませんが、Ruby は初めてです。

PS私はRuby 1.9.3 PPSでRails 3.2.3を使用しています。最初にgemが見つからなかったため、Gemfile内に「roo」を挿入しました。

ありがとう。

4

1 に答える 1

1

もしあなたがそうするなら

rails runner path/to/script

次に、レールはレール環境をロードし、スクリプトを実行します

于 2012-05-28T10:53:54.833 に答える