2014-10-01 4 views
1

у меня есть:PostgreSQL: выберите записи, где все связанные с ним состояние записи матча

class A < ActiveRecord::Base 
    has_many :abs 
    has_many :bs, through: :abs 
end 

class AB 
    belongs_to :a 
    belongs_to :b 
end 

class B < ActiveRecord::Base 
    has_many :abs 
    has_many :as, through: :abs 
    # and has boolean db field :matches 
end 

Так что я хочу, чтобы реализовать возможности для A, который извлекает и где все это связано Bs matches=true. Как правило, я хотел бы сделать что-то вроде:

A.joins(:bs).where(bs: { matches: true }) 

Но это будет получить, как где по крайней мере, один б соответствует условиям, а не все.

Идеи?

ответ

2

Я хотел бы искать записи, где есть нулевые экземпляры matches: false. Я бы, вероятно, использовать подзапрос, что-то вроде ...

A.joins(:bs).where('(select count(*) from bs where matches = false) = 0') 

Но может быть более ActiveRecord способ сделать это.

+0

Неплохая идея, но PG слишком хныкает о том, что вы положили insde, оператор WHERE (ActiveRecord :: StatementInvalid: PG :: GroupingError: ERROR: функции агрегации запрещены в ГДЕ) – nicooga

+0

@nicooga Хм. Я не знаю конкретного синтаксиса, но я должен предположить, что проще проверить 'count (false) == 0', чем' count (true) == count (*) '. – meagar

Смежные вопросы