我有三种模式:
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'属性来确定关系的类型。目前,作业分为以下几类:“主管”,“工人”,“督察”。将来可能会有更多种类的作业。
我无法编写Active Record范围来查找缺少特定类型分配的项目。例如,目前我正在使用以下内容来查找已分配工人的项目。
class Project < ActiveRecord::Base
def self.assigned_workers
joins(:assignments).where(assignments: { :kind => 'worker' })
end
end
我如何编写上述示例的反面,并找到没有指定工作人员的项目?
答案 0 :(得分:2)
我认为你想要一个左联接。不幸的是,Rails并不容易。但是你仍然可以使用SQL片段:
d = {}
with open("numbers.txt") as numbers:
for line in numbers:
pairs = line.split()
for i in range(0,len(pairs),2):
d[pairs[i]] = int(pairs[i+1])
print(d)
因此SQL对赋值类型为&#39; worker&#39;的赋值执行LEFT JOIN,但仅选择没有匹配赋值的行。
答案 1 :(得分:0)
如果你使用Rails 4.0+,你可以否定上面的那个:
joins(:assignments).where.not(assignments: { :kind => 'worker' })
这将为您提供所有未分配工人的项目。