Rake任务更新记录

时间:2017-12-03 16:28:29

标签: ruby-on-rails ruby

我正在做一个rake任务,正在废弃一个网站,以便找到音乐会:

LIB /任务/ my_task.rake

  task :find_concerts  => :environment do

    doc = Nokogiri::HTML(open(url))
    data = doc.search('#dateconcert table')
    data = data.css('.jaunec' ).map { |tr| tr.css('td').map(&:text) } + doc.css('.jaunef' ).map { |tr| tr.css('td').map(&:text) }

    data.each do |concert|
      c = Concert.new
      c.date = concert[0]
      c.city = concert[1]
      c.save
    end
  end

我想要什么

我想在添加新的音乐会时(在我正在报废的网站上)收到警报,因此每天都会运行任务。

我的问题

如果有新记录,我希望我的Concert列表更新...

通过我写的任务,它再次找到已经存储并复制它们的记录...... 我只想要找到可以找到的新记录......

最后,我想比较最后两个任务之间的新内容,以便在发现新内容时发送警报。

修改

这是data返回的内容

[
 ["03 Décembre 2017", "PONT L\u0092ABBE (29)  | Centre Culturel Le Triskell "],
 ["26 Janvier 2018", "MONTPELLIER (34)  | Le Jam "],
 ["17 Février 2018", "BLOIS (41)  | All That Jazz / Les Lobis "], 
 ["22 Mars 2018", "MOISSAC (82)  | Hall de Paris "],
 ["24 Mars 2018", "LAX (Baraqueville) (12)  | Festival Lax'N Blues LAX\u0092N "],
 ["08 Décembre 2017", "ECHANGE CULTUREL CAMEROUN (0)  | au 18 décembre 2017 - Organisation tournée MFR "],
 ["27 Janvier 2018", "LE THOR (84)  | Le Sonograf "],
 ["16 Mars 2018", "CHAUMONT (52)  | Le Nouveau Relax "],
 ["23 Mars 2018", "AUCH (32)  | Le Cri'Art "]
]

2 个答案:

答案 0 :(得分:1)

我找到了一个可能需要重构的解决方案。

所以我创建了两个任务,

  • find_concerts将手动为第一个废料运行
  • update_concerts每天都会投放

<强>任务

require "nokogiri"
require "open-uri"
require "date"
require "time"

 namespace :scrap do

  desc "This get MM concerts"

  url = "http://mountain-men.fr/concerts/"
  doc = Nokogiri::HTML(open(url))
  data = doc.search('#dateconcert table')
  data = data.css('.jaunec' ).map { |tr| tr.css('td').map(&:text) } + doc.css('.jaunef' ).map { |tr| tr.css('td').map(&:text) }

  task :find_concerts  => :environment do
    data.each do |concert|
      c = Concert.create
      c.date = concert[0]
      c.city = concert[1]
      c.save
    end   
  end

  task :update_concerts  => :environment do
    existing_date = Concert.all.map { |c| [c.date, c.city] }
    data.each do |concert|
      c = Concert.create
      c.date = concert[0]
      c.city = concert[1]
      c.save unless existing_date.include?([concert[0], concert[1]])
    end
    Concert.where(city: nil, date: nil).destroy_all
  end
 end

答案 1 :(得分:0)

我不确定我是否理解正确,但你需要做的是检查它是否存在以及其他明智的创造。

我会做这样的事情。

  task :find_concerts  => :environment do

    doc = Nokogiri::HTML(open(url))
    data = doc.search('#dateconcert table')
    data = data.css('.jaunec' ).map { |tr| tr.css('td').map(&:text) } + doc.css('.jaunef' ).map { |tr| tr.css('td').map(&:text) }

    data.each do |concert|
      Concert.where(data: concert[0], city: concert[1]).first_or_create
    end
  end

现在,只有在它不存在的情况下才会创建。然后,当你创建一个时,你可以设置一个钩子。

class Concern
  after_create :send_notification

  def send_notification
    # send email here
  end
end