2012-06-08 4 views
2

Я хочу найти вещи, в которых есть дети. Поэтому, учитывая:ActiveRecord - найти родителей

class Foo < ActiveRecord::Base 
    has_many :bars 
    has_many :bazes 

    scope :is_a_parent ...what goes here?... 

Я хочу, чтобы получить FOOS, которые имеют какие-либо бары или любые bazes. Конечно, все возможно с необработанным SQL, exists (select 1 from bars ...) or exists (select 1 from bazes ...), но yuk.

Несомненно, есть способ использовать any? в сочетании с isl or метод? Другой способ сделать это, не прибегая к SQL?

ответ

0

Помогает ли вам? this? Этот предварительный ответ ищет обратную для вас (Foos, у которой нет баров и басов), но вы должны иметь возможность инвертировать логику.

+0

Это не сработает. Он не работал бы даже для одной коллекции, потому что он возвращал несколько строк для каждого Foo. Возможно, AR разобрал бы это, но это рискованно и хакерски, чтобы рассчитывать на это. Во всяком случае, я уверен, что он падает на мой сценарий двух детских коллекций. –

0
class Foo < ActiveRecord::Base 
    has_many :bars 
    has_many :bazes  

    scope :is_a_parent, (joins(:bars) or joins(:bazes)).uniq 

даст вам все FOOS, имеющие бар или Базе

Btw, как правило, функций, начиная с «is_», должно заканчиваться «?», И он должен возвращать только истина/ложь.