2016-12-04 2 views
0

Ich versuche ein scheinbar einfaches AR-Problem zu lösen, das ich habe. Ich kann nicht herausfinden, wie eine Liste von Ereignissen mit mindestens einem Teilnehmer zurückgegeben wird. In den Beispieldokumenten wird cache_control verwendet, die ich nicht verwenden möchte.ActiveRecord has_many wobei das Kindmodell größer als 0 ist

Ich habe ein einfaches Ereignismodell mit einer has_many Beziehung:

class Event < ActiveRecord::Base 
    has_many :attendees 
end 

und ein Teilnehmer-Modell, das

class Attendees < ActiveRecord::Base 
    belongs_to :event 
end 

Aber einige Veranstaltungen 0 Teilnehmer Veranstaltung gehört haben. Also, was ist die ActiveRecord Methode, dies zu tun, ohne cache_control zu verwenden oder eine benutzerdefinierte SQL-Anweisung zu schreiben?

Es scheint, wie es so etwas wie wäre:

Event.where(attendees.count > 0)

aber ich erhalte eine Spalte Fehler.

+0

Ihre Modellklasse ist 'Atendee' oder' Atendees'? – sa77

Antwort

0

Um nur Ereignisse mit den Teilnehmern erhalten Sie tun können: Event.joins(:attendees).uniq.all

all am Ende Aufruf gibt ein Array während Abwurf es Sie mit einer Active Beziehung zu verlassen.

0

können Sie where Verfahren mit nicht angekettet verwenden diese

Event.where.not(id: Attendee.select(:event_id)) 
0

zu tun Wenn Sie ein LEFT INNER JOIN nur Datensätze mit einem Spiel in der Tabelle zurückgegeben werden beitreten tun. Sie müssen also nicht wirklich zählen.

Event.joins(:attendees) 

Wird nur geben Sie Ereignisse, die Teilnehmer haben. Das Gegenteil wäre eine LEFT OUTER JOIN, die Zeilen von events zurückgibt, auch wenn es keine entsprechenden Zeilen in attendees gibt.

Counter-Caches auf der anderen Seite kann für die Leistung von Vorteil sein, da es eine COUNT Abfrage in der zugeordneten Tabelle vermeidet, wenn Sie eine Lazy Loading-Zuordnung verwenden möchten. Dies kann nützlich sein, wenn Fragment-Caching verwendet wird oder wenn die Abfrage für die verknüpfte Tabelle teuer ist.

<%# counter cache avoids query %> 
<% cache(event) do %> 
<ul> 
    <%# only perform query if cache is stale %> 
    <% event.attendees.each do |a| %> 
    <li><%= link_to a.name, a %></li> 
    <% end %> 
<ul> 
<% end if event.attendees.any? %> 
+0

Wenn Sie wirklich eine Zählung durchführen möchten, müssen Sie der Tabelle beitreten oder einen Subselect durchführen. Ihr Ansatz funktioniert nicht, da die Tabelle "Teilnehmer" nicht in der FROM-Klausel in der Abfrage enthalten ist. – max

Verwandte Themen