Rails - has_many:通过查找没有关联的记录

时间:2015-12-31 18:28:57

标签: ruby-on-rails activerecord

我有三个模特

class Person < ActiveRecord::Base
  has_many :assignments
  has_many :projects, through: :assignments
end

class Project < ActiveRecord::Base
  has_many :assignments
  has_many :people, through: :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :person
  belongs_to :project
end

我在Assignment模型上使用名为'kind'的属性来确定此人与该属性的关联方式。它是一个字符串字段,可能的值包括:'supervisor','worker','inspector'。

我已将该属性添加到Assignment模型而不是Person模型,因为在某些情况下,一个人可能同时成为一个项目的工人,另一个人同时成为另一个项目的主管。

需要注意的是,在创建主管时会自动分配。因此,所有项目都至少有一项任务。

我想知道的是:

如何查询未分配工人的所有项目?这将是一个没有任务的项目,在类列中有“工人”。

3 个答案:

答案 0 :(得分:1)

为了提高效率,您可以使用counter_cache列。

class Assignment < ActiveRecord::Base
  belongs_to :person
  belongs_to :project, counter_cache: true
end

Project.where(assigments_count: 0)

检查:Rails guides中的counter_cache部分 请注意,您需要在已创建的模型上重置计数器缓存列。

答案 1 :(得分:1)

您可以使用ActiveRecord的joins查询方法来完成此操作。

Project.joins(:assignments).where('assignments.kind <> ?', 'worker')

这将导致以下查询

SELECT "projects".* FROM "projects" INNER JOIN "assignments" ON "assignments"."project_id" = "projects"."id" WHERE (assignments.kind <> 'worker')

希望这会有所帮助。干杯!

答案 2 :(得分:0)

如果您想避免额外的列和数据库更新,请使用SQL SQL - find records from one table which don't exist in another + rails raw sql example