获取不包含其他模型的模型

时间:2015-03-06 13:21:40

标签: ruby-on-rails ruby activerecord

我有两个模型AB,它们之间有has_and_belongs_to_many个关联。我希望获得与当前A无关联的B的所有实例:

class A < ActiveRecord::Base
  def find_that_does_not_have(model_b)
    ...
  end
end

我想我必须使用像这样的东西:

find(:all, :conditions => [])

有可能吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么一个解决方案是制作相应的类方法:

class A < ActiveRecord::Base
    def self.find_that_does_not_have(model_b)
        (A.all.map {|a| a unless a.bs.include?(model_b)}).compact
    end
end

所以你可以这样问:

model_b = B.find(your_id)
A.find_that_does_not_have(model_b)

它闻起来像scope的工作,但我想我现在也不像这样代表它:)

编辑:在用户@ 0v3rc10ck3d的帮助下,我提出了这样的范围:

scope :find_that_does_not_have_b, lambda {|model_b| joins(:bs).where("b_id != #{model_b.id}")}

但它会返回与关系有关的所有模型A对象,因此存在重复。因此,您应该在请求时添加uniq

A.find_that_does_not_have_b(model_b).uniq 

答案 1 :(得分:0)

scope : find_that_does_not_have_b, lambda {|b_id| joins(:association_table).where('association_table.b_id != b_id')}

可能会做这个工作。无法测试它。称之为:

A.find_that_does_not_have_b(b_id)

在这里澄清一些事情。因此,您需要一个与给定B对象无关的所有A对象的列表。对吗?