Экспорт объектов ActiveRecord в PORO - PullRequest
0 голосов
/ 24 марта 2010

Я разрабатываю «генератор сценариев» для автоматизации некоторых процессов на работе. На сервере запущено приложение Rails, в котором хранятся все данные, необходимые для создания сценария, и создается сам сценарий в конце процесса.

Проблема, с которой я сталкиваюсь, заключается в том, как экспортировать данные из формата ActiveRecord в простые старые объекты Ruby (PORO), чтобы я мог работать с ними в моем сценарии без поддержки базы данных и реализации в чистом рубине.

Я думал о YAML, CSV или о чем-то подобном, чтобы экспортировать данные, но было бы болезненно обновлять эти структуры, если процесс изменится. Есть ли более простой способ?

Ty!

1 Ответ

2 голосов
/ 24 марта 2010

Под «обновлением этих структур, если процесс изменяется», вы имеете в виду изменение кода, который считывает и записывает данные CSV или YAML, когда поля в базе данных изменяются?

Следующий код записывает и считывает любой объект AR в / из CSV (требуется гем FasterCSV):

def load_from_csv(csv_filename, poro_class)

  headers_read = []
  first_record = true
  num_headers = 0
  transaction do 
    FCSV.foreach(csv_filename) do |row|
      if first_record
        headers_read = row 
        num_headers = headers_read.length
        first_record = false
      else
        hash_values = {}

        for col_index in 0...num_headers
          hash_values[headers_read[col_index]] = row[col_index]
        end
        new_poro_obj = poro_class.new(hash_values) # assumes that your PORO has a constructor that accepts a hash. If not, you can do something like new_poro_obj.send(headers_read[col_index], row[col_index]) in the loop above
        #work with your new_poro_obj 
      end
    end
  end

end

#objects is a list of ActiveRecord objects of the same class
def dump_to_csv(csv_filename, objects)

  FCSV.open(csv_filename,'w')  do |csv|
    #get column names and write them as headers
    col_names = objects[0].class.column_names()
    csv << col_names
    objects.each do |obj|
      col_values = []
      col_names.each do |col_name|
        col_values.push obj[col_name]
      end
      csv << col_values
    end
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...