Rails - 查找没有特定类型的关联记录的记录

时间:2016-04-05 17:42:53

标签: 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'属性来确定关系的类型。目前,作业分为以下几类:“主管”,“工人”,“督察”。将来可能会有更多种类的作业。

我无法编写Active Record范围来查找缺少特定类型分配的项目。例如,目前我正在使用以下内容来查找已分配工人的项目。

class Project < ActiveRecord::Base
  def self.assigned_workers
    joins(:assignments).where(assignments: { :kind => 'worker' })
  end
end

我如何编写上述示例的反面,并找到没有指定工作人员的项目?

2 个答案:

答案 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' })

这将为您提供所有未分配工人的项目。