2015-03-22 4 views
0

В моих моделях Event и Artist являются отношениями HABTM. События по умолчанию привязаны к текущим событиям по дате, поэтому отображаются только события, которые еще не были выполнены. Я пытаюсь написать метод или область, чтобы получить все от Artist, у которых нет текущих событий. Я попытался ActiveRecord отношениеRails ActiveRecord охватил множество запросов

none = Artist.where{|a| a.events.default_scope.count == 0} 

Но это возвращает

ActiveRecord::QueryMethods::WhereChain 

А потом я не могу получить фактические объекты для работы. Затем, когда я перебираю все. Все это очень медленно, потому что в моделях есть тонна данных.

Artist.all.select{|a| a.events.default_scope.count == 0} 

Что такое быстрый или лучший способ справиться с этим?

+0

вам необходимо предоставить точное определение этих отношений в ваших моделях – xlembouras

ответ

1

Используйте LEFT JOIN на событиях и присоединиться к таблице, добавить условие для включения только текущие события, и получить только художников, где нет событий:

scope :no_events, -> { 
    joins('LEFT JOIN artists_events ON artists.id = artists_events.artist_id') 
    .joins('LEFT JOIN events ON events.id = artists_events.event_id') 
    .where([here the condition for current events]) 
    .where('events.id IS NULL') 
} 

Вы, возможно, потребуется добавить distinct

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