我有两个模型A
和B
,它们之间有has_and_belongs_to_many
个关联。我希望获得与当前A
无关联的B
的所有实例:
class A < ActiveRecord::Base
def find_that_does_not_have(model_b)
...
end
end
我想我必须使用像这样的东西:
find(:all, :conditions => [])
有可能吗?
答案 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对象的列表。对吗?