Пакетное обновление нескольких таблиц в Ruby On Rails - PullRequest
0 голосов
/ 13 ноября 2011

Мне нужна помощь в обдумывании процесса для пакетного обновления нескольких таблиц для приложения RoR.Ниже приведены мои модели:

class User < ActiveRecord::Base  
    has_many :addresses  
    has_many :phones  
end  


class Address < ActiveRecord::Base  
    belongs_to :user  
    has_one    :addresstype      
end  


class Phone < ActiveRecord::Base  
    belongs_to :user  
    has_one    :phonetype  
end  


class PhoneType < ActiveRecord::Base  
    belongs_to :phone  
end  


class AddressType < ActiveRecord::Base      
    belongs_to :address    
end    

Вы можете себе представить, что в таблице "Address" есть user_id, PhoneType имеет phone_id, а AddressType имеет ключи address_id для поддержки ассоциаций.

Итак, я хочу обработать некоторыефайлы с записями пользователей для вставки в соответствующие таблицы.Например,

...  
    usr1@foo.com,1234 sw main st. ca 19820,offce,425-378-1188,mobile  
    usr1@foo.com,7869 sw fool st. ca 19820,residential,425-898-2345,landline  
    usr2@foo.com,4321 sw oak st. ca 19822,offce,435-378-1298,mobile  
    usr3@foo.com,8789 sw adler st. ca 19822,residential,436-898-6234,landline  
...

миллионов из них либо все в одном файле, либо по одной записи на файл, передаваемый с удаленного сервера.

ИЛИ, есть ли другой способ обработки этих удаленных запросов по требованию?Например, удаленные серверы отправляют запись в мое приложение RoR, и она обрабатывается через приложение RoR.В обоих случаях я хочу убедиться, что данные для вставки проходят все правила проверки.Как формат электронной почты является действительным, или адрес не может быть пустым.

Эти записи могут быть в формате json для экономии на размере данных, передаваемых в файле.

Во время обработки пользователь (usr1@foo.com) может или не может существовать.

Спасибо, и я очень ценю любую помощь.

Атаранг.

1 Ответ

0 голосов
/ 14 ноября 2011

Вы можете сделать оба. Если у вас есть один файл, вы можете просто создать скрипт ruby ​​и включить config/environment.rb, чтобы загрузить среду приложения rails в ваш скрипт ruby. Затем вы можете загрузить файл и обработать каждую строку следующим образом:

include 'config/environment.rb'
File.open("/folder/folder/file_to_parse", "r").each_line do |line| 
     .....
     # interpret line here
     ....
end

Если это в формате CSV, вы также можете использовать Ruby CSV Librarie (http://ruby -doc.org / stdlib-1.9.2 / libdoc / csv / rdoc / CSV.html)

С другой стороны, вы также можете создать интерфейс для анализа данных в JSON. Вы можете использовать реализацию JSON для ruby ​​(которая описана здесь: http://flori.github.com/json/), чтобы создать действие, которое анализирует один объект, который передается в JSON.

// О проверках:

Пишите валидации в моделях! Затем вы проверяете все модели, которые belongs_to sth. потому что у вас уже может быть PhoneType, которые используются в фактической записи. Поэтому будьте осторожны, чтобы не получить дубликаты, когда они вам не нужны.

После этого вы используете метод new для создания новых объектов (не create, потому что создаете записи в базу данных). Затем вы анализируете строку, и когда она анализируется, вы можете проверить все свои объекты, используя метод valid?, который проверяет, проходит ли объект все проверки, определенные в модели.

И только если все ваши объекты проходят проверку, вы сохраняете их в базе данных. В противном случае вы просто не выполняете метод save, поэтому наборы данных, которые не проходят проверки, не сохраняются в базе данных.

// About th eperformende

Если вам просто нужно выполнить импорт один раз, это не такая уж большая проблема, если скрипт не настолько совершенен. Что вы должны делать, когда в таблице много записей (100 не много, 100000 - это ...), вы должны добавить индексы ко всем столбцам внешнего ключа. Вы можете создать миграцию addIndexesToForeignKeys и добавить индексы с помощью метода add_index следующим образом:

add_index :table_name, :column_name

Это ускорит выборочные запросы и немного замедлит вставку, но я думаю, что действия show будут вызываться чаще, чем создания действий;)

...