Hacking ActiveRecord: füge globalen benannten Bereich hinzu

8

Ich versuche, ein Paket mit sehr generischen benannten Bereichen für ActiveRecord-Modelle wie dieses zu haben:

%Vor%

Wenn der benannte Bereich allgemein sein soll, müssen wir * table_name * angeben, um Benennungsprobleme zu verhindern, wenn es sich um Joins handelt, die von anderen verketteten benannten Bereichen stammen.

Das Problem ist, dass wir table_name nicht abrufen können, weil es auf ActiveRecord :: Base und nicht auf User aufgerufen wird.

%Vor%

Wie kann ich den tatsächlichen Tabellenname im Scopes-Modul erhalten?

    
Bogdan Gusiev 30.09.2010, 09:02
quelle

4 Antworten

1

Rails 5, ApplicationRecord (Hoffe es hilft anderen)

%Vor%

In Rails 5 werden alle Modelle standardmäßig von ApplicationRecord geerbt. Wenn Sie diesen Gültigkeitsbereich nur für bestimmte Modellgruppen anwenden möchten, fügen Sie nur für diese Modellklassen include-Anweisungen hinzu. Dies funktioniert auch für Join-Abfragen und verkettete Bereiche.

    
Ashik Salman 28.02.2018, 04:25
quelle
13

Verwenden Sie die Methode #scoped innerhalb einer Klassenmethode von ActiveRecord :: Base. Dies sollte funktionieren:

%Vor%     
Sidane 30.09.2010 09:38
quelle
0

Weitere nützliche Bereiche unten:

%Vor%     
Quentin Rousseau 23.04.2014 21:26
quelle
0

Hier ist eine aktualisierte Rails4 kompatible Lösung.
Mir wurde gesagt, dass das Definieren globaler Bereiche wie dies zu Konflikten führen kann, caveat emptor und all das, aber manchmal braucht man nur einen einfachen Bereich für alle Modelle, richtig?

Definieren Sie ein Modul.

%Vor%

Lassen Sie das Modul in ActiveRecord::Base enthalten.

%Vor%

Das ist es! Beachten Sie, dass Sie sich in Rails4 nicht mit: scoped herumschlagen müssen, sondern stattdessen: all und ketten Sie Ihre Abfrage dorthin.

    
Epigene 22.09.2015 07:03
quelle