我有三个模特
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模型,因为在某些情况下,一个人可能同时成为一个项目的工人,另一个人同时成为另一个项目的主管。
需要注意的是,在创建主管时会自动分配。因此,所有项目都至少有一项任务。
我想知道的是:
如何查询未分配工人的所有项目?这将是一个没有任务的项目,在类列中有“工人”。
答案 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