【问题标题】:Rails: Advanced sql queryRails:高级 sql 查询
【发布时间】:2015-03-23 00:06:57
【问题描述】:

我正在尝试在给定工作的显示页面上显示相关工作。当用户查看任何特定工作时,应根据标签(我正在使用作为可标记的 gem)、工作功能(工作 has_many:job_functions)、经验显示所有相关工作(必须根据其权重显示) & 国家(我正在使用国家/地区选择 gem)。

如果有一份工作的所有这些标准都与给定的工作相似,那么它的权重 = 100

如果另一个职位只有标签、工作职能和国家/地区相似,则它的权重 = 70。所以我可以根据重量对工作进行排序

其实我只是根据标签找到相关工作

@related_jobs = Job.tagged_with(@job.tag_list, any: true)

而且我还可以根据工作职能找到相关工作

@related_jobs = Job.includes(:functions)
                    .where('jobs.id != ?', @job.id)
                    .where(functions: { id: @job.functions.pluck(:id) } )

【问题讨论】:

  • 这是一个伟大的目标。你有什么问题?
  • 我怎样才能做到这一点?我的代码放在哪里?它似乎不会在控制器中
  • 不,这不属于控制器。这似乎应该是 Job 类上的一个方法
  • 但是我如何将给定的工作与我的工作模型中的其他工作进行比较,我该如何做?
  • 模型是作业的一个实例,模型中不能有两个可比较的调用。每次调用 Job 时,都会创建该 Job 模型的新实例。将两个函数放入 Job 模型中,然后在控制器中比较它们,或者如果它看起来对您不利,请在控制器下关注它。

标签: sql ruby-on-rails ruby ruby-on-rails-4 matching


【解决方案1】:

根据一定数量的标准寻找相关工作,并根据“匹配程度”对相关工作进行加权,这听起来像是 Job 类的任务。我会在 Job 类中创建一个方法(也许是“get_related_weighted_jobs”)。

在该方法中,使用 Job 实例的属性来查找并分配权重给其他匹配的作业,然后返回排序列表。控制器只会加载要显示的作业,然后要求该作业找到它的匹配项。

def show
  @job = Job.find(params[:id])
  @related_jobs = @job.get_related_weighted_jobs()
end

【讨论】:

  • 所以你的建议是在工作模型中创建一个方法?
  • 是的。通过在 Job 类中创建一个方法,该方法可以访问当前作业的属性,毕竟在 MVC 世界中,有什么实体比 Job 类本身的实例更适合找到相关作业。不是控制器的任务,当然也不是视图的任务。 (意见——业务逻辑,例如匹配和加权,属于模型)。根据其标签、功能、经验和国家属性,特定工作可能匹配或权重不同。
  • 但是,例如,我如何仅根据模型中的标签将当前工作与另一个工作进行比较,我可以调用 @job = Job.find_by_slug(params[:id]) 并在那之后工作就像我在控制器中工作一样
  • 再次,Job 类的方法。通过您想要的任何查找器方法找到@job,然后要求该工作完成工作。控制器不一定知道如何比较两个作业,但它肯定知道如何要求 Job 类的一个实例将自己与 Job 类的另一个实例进行比较。
  • 实际上我正在做的是 def final_score experience_score + .... end def experience_score Job.where(experience == self.experience).count end 但这总是返回我的工作数量db 而不是只有经验相似的工作我该如何解决这个问题
猜你喜欢
  • 2021-02-11
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2011-03-24
  • 2014-06-08
相关资源
最近更新 更多