使用Ruby on Rails将多个数据插入数据库

时间:2013-03-01 21:22:14

标签: ruby-on-rails ruby database multithreading

我认为这是我的第一个问题,希望尽可能清楚。我有以下代码。

def index_service_name
@currentService = Feed.where("name = '#{params[:name]}'").first

serviceId = @currentService['id']
serviceName = @currentService['name']
serviceFeedUrl = @currentService['feedUrl']

feed = Feedzirra::Feed.fetch_and_parse(serviceFeedUrl)

  feed.entries.reverse.each do |entry|
    case serviceName
      when 'service1', 'service2'
        uniqueId = entry.url.match(/\d+$/)[0]
        postContent = Nokogiri::HTML( entry.content ).css('img').map{ |i| i['src'] }.first # this would be an array.
      else
        uniqueId = entry.url
        postContent = entry.content
    end

    isIndexed = Post.where("post_unique_id = '#{uniqueId}' AND post_service = '#{serviceId}'")

    if postContent =~ %r{\Ahttps?://.+\.(?:jpe?g|png|gif)\z}i
      isImage = true
    elsif postContent =~ %r{http?s://(.*)/maxW500/}i
      isImage = true
    end

    if isIndexed.empty? && isImage
      sleep 1.seconds
      Post.create(post_service: serviceId, post_service_name: serviceName, title: entry.title, content: postContent, url: entry.url, post_unique_id: uniqueId)
    end
  end

我使用常规URL(/ something / service / service1,/ something / service / service2)触发服务。如果我在同一时间触发它们,似乎每个人都在等待另一个结束(因此在我的数据库中,数据首先从service1存储,然后从service2存储)。我认为这必须对多线程做一些事情,据我所知,ROR还没有支持它。

我是ROR的新手所以请保持温柔。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

假设您正在使用MRI红宝石,那么您没有并行多线程。 MRI有绿色线,不能并行运行。如果使用JRuby实现ruby,则可以使用并行多线程。

无论哪种方式,启动服务器的2个实例,您就可以并行运行该代码。使用rails s -p 3000rails s -p 3001启动2个服务器:端口3001和3000.然后尝试访问端口3000上的一个URL和端口3001上的另一个URL。这样您的代码将并行运行。