2012-01-13 4 views
1

У меня есть следующий Nokogiri задача грабель в моем Rails (3.1) Применение:Rails 3.1 создает запись, а не обновление?

desc "Import incoming calls" 
task :fetch_incomingcalls => :environment do 

    # Logs into manage.dial9.co.uk and retrieved list of incoming calls. 
    require 'rubygems' 
    require 'mechanize' 
    require 'logger' 

    # Create a new mechanize object 
    agent = Mechanize.new 

    # Load the dial9 website 
    page = agent.get("https://manage.dial9.co.uk/login") 

    # Select the first form 
    form = agent.page.forms.first 
    form.username = 'username 
    form.password = 'password' 

    # Submit the form 
    page = form.submit form.buttons.first 

    # Click on link called Call Logs 
    page = agent.page.link_with(:text => "Call Logs").click 

    # Click on link called Incoming Calls 
    page = agent.page.link_with(:text => "Incoming Calls").click 

    # Output results to file 
    # output = File.open("output.html", "w") { |file| file << page.search("tbody td").text.strip } 

    # Add each row to a new call record 
    page = agent.page.search("table tbody tr").each do |row| 
     next if (!row.at('td')) 
     time, source, destination, duration = row.search('td').map{ |td| td.text.strip } 
     Call.create!(:time => time, :source => source, :destination => destination, :duration => duration) 
    end 
end 

Значение времени является первой строкой в ​​таблице и является уникальным на вызов (как мы можем получить только один вызов в то время,).

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

Таким образом, при очистке экрана он будет «обновлять» существующие вызовы (которые не изменятся, но это единственный способ, которым я могу думать только об импорте новых вызовов).

Если установить его:

Call.find_all_by_time(nil).each do |call| 

, а затем:

call.update_attribute(:time, time) 

Тогда будет обновлять существующие записи, но я хочу, чтобы импортировать записи, которые уже не в нашей базе - на основе значения времени.

Любая помощь приветствуется!

ответ

1

Вы имеете в виду это?

# Add each row to a new call record 
page = agent.page.search("table tbody tr").each do |row| 
    next if (!row.at('td')) 
    time, source, destination, duration = row.search('td').map{ |td| td.text.strip } 
    call = Call.find_or_create_by_time(time) 
    call.update_attributes({:time => time, :source => source, :destination => destination, :duration => duration}) 
end 
+0

Это именно то, что я имел в виду - спасибо! – dannymcc

Смежные вопросы