Ruby on rails 两种不同型号的Activerecord规格

Ruby on rails 两种不同型号的Activerecord规格,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我需要找到一种方法来显示我的空缺模型中的所有空缺,但用户已经申请的空缺除外。 我将某个用户申请的空缺的ID保存在一个单独的模型AppliedVacances中 我在想一些事情,比如: @applied = AppliedVacancies.where(employee_id: current_employee) @appliedvacancies_id = [] @applied.each do |appliedvacancy| @appliedvacancies_id << a

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

我在想一些事情,比如:

@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行:从id!=13,14 ^
:从id!=13,14这纯粹是一个SQL问题

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

@notyetappliedvacancies = Vacancy.where("id NOT IN (?)", @appliedvacancy_id)
顺便说一句,您可以大大改进迄今为止编写的代码。当您只需要ID时,您就不需要为应用表中的每个记录实例化完整的ActiveRecord模型

改进的第一步是使用Pull跳过整个过程,直接进入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>)

这纯粹是一个SQL问题

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

@notyetappliedvacancies = Vacancy.where("id NOT IN (?)", @appliedvacancy_id)
顺便说一句,您可以大大改进迄今为止编写的代码。当您只需要ID时,您就不需要为应用表中的每个记录实例化完整的ActiveRecord模型

改进的第一步是使用Pull跳过整个过程,直接进入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>)

回答像@meagar,但Rails有4种方式:

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

回答像@meagar,但Rails有4种方式:

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

非常感谢,我有很多东西要学,以提高我的代码效率,作为一个初学者,我很高兴它能工作,但我知道这是我应该注意的。再次感谢。非常感谢,我有很多东西要学,以提高代码的效率,作为一个初学者,我对它的工作原理非常满意,但我知道这是我应该注意的。再次感谢。谢谢,我用了两个答案的组合!谢谢,我使用了两种答案的组合!