Haben Sie Addresse
s und List
s mit vielen-zu-viele-Beziehung, wie unten gezeigt.Gibt es eine ActiveRecord-Methode, um diese SQL-Abfrage auszuführen?
Manchmal müssen alle List
s ein Address
ist nicht in.
Mit der find_by_sql
Abfrage angezeigt, und es funktioniert super. Aber gibt es eine Möglichkeit, dies zu tun, ohne direktes SQL zu verwenden?
class List
has_many :address_list_memberships
has_many :addresses, :through => :address_list_memberships
end
class Address
has_many :address_list_memberships, :dependent => :destroy
has_many :lists, :through => :address_list_memberships
# Lists that this Address is not in
def Address.lists_not_in(address_id)
sql = %Q|
SELECT
l.*
FROM
lists l
WHERE
l.id
NOT IN
(
SELECT
l.id
FROM
addresses a, lists l, address_list_memberships alm
WHERE
a.id = alm.address_id AND l.id = alm.list_id
AND
a.id = #{address_id}
)
|
List.find_by_sql(sql)
end
end
Haben Sie Indizes für Ihre Datenbanktabellen? Ich benutze: Joins auf großen Tabellen bei der Arbeit und ich brauche normalerweise nicht 30 Sekunden, um eine Abfrage auszuführen. Sie sollten sicherstellen, dass Sie Indizes für Ihre Fremdschlüssel haben. – nitecoder
Indizes werden so viel schneller machen. Ich habe meine Antwort bearbeitet, um Code für sie hinzuzufügen. –
-1. Bitte wählen Sie eine Antwort aus den Antworten, anstatt die Antworten manuell auf Ihre Frage zu bearbeiten. –