【问题标题】:Activerecord specifications with 2 different models具有 2 种不同型号的 Activerecord 规格
【发布时间】:2016-01-03 17:11:55
【问题描述】:

我需要找到一种方法来显示我的空缺模型中的所有空缺,除了用户已经申请的空缺。 我将某个用户申请的职位空缺的 ID 保存在单独的 AppliedVacancies 模型中。

我在想一些事情:

@applied = AppliedVacancies.where(employee_id: current_employee)
@appliedvacancies_id = []
@applied.each do |appliedvacancy|
  @appliedvacancies_id << appliedvacancy.id
end
@notyetappliedvacancies = Vacancy.where("id != ?", @appliedvacancy_id)

但它似乎不喜欢获取一组 ID。我该如何解决这个问题?

我收到以下错误:

PG::DatatypeMismatch: 错误: WHERE 的参数必须是布尔类型,而不是记录类型 第 1 行:选择“职位空缺”。* 从“职位空缺” WHERE (id != 13,14) ^ : SELECT "vacancies".* FROM "vacancies" WHERE (id != 13,14)

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    这纯粹是一个 SQL 问题。

    您不能使用!= 将一个值与一组值进行比较。您需要使用IN 运算符。

    @notyetappliedvacancies = Vacancy.where("id NOT IN (?)", @appliedvacancy_id)
    

    顺便说一句,您可以大幅改进迄今为止编写的代码。当您只需要 ID 时,您无需为在 applied_vacancies 表中找到的每条记录实例化完整的 ActiveRecord 模型。

    改进的第一步是使用 pluck 跳过整个过程并直接进入 ID 列表:

    ids = AppliedVacancies.where(employee_id: current_employee).pluck(:id)
    @notyetappliedvacancies = Vacancy.where("id NOT IN (?)", ids)
    

    接下来,您可以更进一步,将第一个查询全部消除(或者更确切地说,将其与最后一个查询组合为子查询),将其保留为 AREL 投影,可以直接插入到第二个查询中:

    ids = AppliedVacancies.select(:id).where(employee_id: current_employee)
    @notyetappliedvacancies = Vacancy.where("id NOT IN (?)",App)
    

    这将生成一个查询:

    select * from vacancies where id not in (select id from applied_vacancies where employee_id = <value>)
    

    【讨论】:

    • 非常感谢,为了让我的代码高效,我还有很多东西要学.再次感谢您。
    【解决方案2】:

    像 @meagar 一样回答,但 Rails 4 方式:

    @notyetappliedvacancies = Vacancy.where.not(id: @appliedvacancy_id)
    

    【讨论】:

    • 谢谢,我使用了两个答案的组合!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2012-05-05
    相关资源
    最近更新 更多