2014-09-11 2 views
1

Вот мои ассоциации:Rails: получить родительские записи с нулём HAS_MANY ассоциации

class User < ActiveRecord::Base 
    has_many :tickets 
end 

class Ticket < ActiveRecord::Base 
    belongs_to :user 
end 

Довольно просто. Я хочу область на модели User, которая возвращает всех пользователей, имеющих точно связанные с ZERO билеты.

В настоящее время я использую Ruby, чтобы сделать это по большей части, как так:

def self.never_flown 
    results = [] 
    find_each do |user| 
    results << user if user.tickets.count == 0 
    end 
    results 
end 

... который сосет, потому что это не хороший пример использования для Ruby. Но я изо всех сил пытаюсь понять, как это сделать с помощью SQL.

Может ли кто-нибудь сообщить мне хорошее, чистое SQL-решение?

ответ

1

Может быть что-то вроде: User.includes(:tickets).where(tickets: {user_id: nil})

в объеме было бы как :without_tickets, -> { includes(:tickets).where(tickets: {user_id: nil}) }

+0

Спасибо @Olivier! – mecampbellsoup

1

SQL-подзапрос может быть использован, который может быть более эффективным, чем при использовании includes():

User.where('id not in (select user_id from tickets)') 
+0

Это тоже работает, но я выбираю вышеупомянутый ответ, поскольку он, возможно, более ясен. Тем не менее, я хочу сравнить оба, и подтвердить, что работает лучше. – mecampbellsoup

1

Вы можете также делают примерно следующее:

User.joins("LEFT OUTER JOIN orders ON orders.user_id = users.id WHERE orders.user_id IS NULL") 

Хотя подход @ oliver-roset немного проще и понятнее для тех, кто читает ваш код позже.

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