首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >应该把它移到后台任务吗?

应该把它移到后台任务吗?
EN

Stack Overflow用户
提问于 2014-01-28 04:51:56
回答 2查看 49关注 0票数 1

我有一个有用户和乔布斯的招聘系统。

它们之间存在着一种has_many关系:通过潜能。

这将使管理员能够从本质上了解用户很可能适合某项工作。

要做到这一点,我有一个after_create和一个after_save事件,像这样--

代码语言:javascript
代码运行次数:0
运行
复制
 class User < ActiveRecord::Base

  after_create :create_potentials
  after_save :set_potentials

  private
    def create_potentials
      Job.all.each do | job | 
        potential = Potential.new
        potential.job_id = job.id
        potential.user_id = self.id
        potential.save!
      end
    end

    def set_potentials
      self.potentials.each do |potential|
        potential.level = potential.find_potential
        potential.save!
      end
    end

不过,这让我很担心。首先,我使用整个模型只是为了一个属性,“潜力”,这似乎有点古怪。

第二个问题是,在创建用户之后,我将为所有的工作创造潜力。

目前,这些工作相对较少(即30岁以下),但这是许多潜在的计算任务。

after_create和after_save事件能异步运行吗?

EN

回答 2

Stack Overflow用户

发布于 2014-01-28 05:01:48

您可以使用像延迟作业这样的Gem异步运行方法。

工作

您的优化问题的答案可能取决于,如您所说,有多少工作,用户,因此“潜力”可能存在。正确的方法还取决于您是否需要使用SQL查询它们,或者是否可以动态地计算它们。

您的当前关联代码可以通过通过关联创建潜在值而略为缩短。如果您决定为每个Potential为每个User创建一个每一个,那么您将希望使用每一个来避免将每个作业同时加载到内存中。

代码语言:javascript
代码运行次数:0
运行
复制
  Job.find_each { |job| job.potentials.create!(user_id: self.id) }
票数 1
EN

Stack Overflow用户

发布于 2014-01-28 06:14:29

根据你的Qsn,for every new user created. Entries are made into potential table for each job id along with the user_id.

要更新用户条目,potential level is being updated for all the potential table entries for that user which equals total no of jobs present.

如果您正在为用户寻找实时更新,那么您需要跳过cron部分并实现逻辑以减少查询的no。如果这不是一个限制,那么建议使用cron作业来处理它,使用redis/resque来处理after_create和after_save任务。当任何用户创建或更新任务时,这些作业将由正在运行的redis服务器处理。

正如doctororange在回答中所建议的那样,如果您希望定期处理任务,而不管对用户表的任何更改,也可以查看延迟作业。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21397091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档