Kann ich einen ActiveRecord-Bereich als Instanzmethode verwenden?

8

Ich habe einen Bereich, der als Filter fungiert. Zum Beispiel:

%Vor%

Da in_good_standing von mehr als einer Bedingung abhängt, möchte ich, dass dies für eine Instanz von User als definiert ist:

%Vor%

Ich möchte jedoch wirklich vermeiden, die Logik zwischen der Instanzmethode und dem benannten Bereich zu duplizieren. Gibt es eine Möglichkeit, #in_good_standing? auf eine Weise zu definieren, die sich einfach auf den Bereich bezieht?

bearbeite

Ich erkenne, dass dies sehr unterschiedliche Konzepte sind (eine ist eine Klassenmethode, eine ist eine Instanzmethode), daher meine Frage. Wie @MrDanA in einem Kommentar erwähnt, ist die nächste, die ich bekommen kann, zu überprüfen, ob der Datensatz, über den ich neugierig bin, im größeren Rahmen existiert, was wahrscheinlich die Antwort ist, nach der ich suche.

Die Antworten zum Trennen verschiedener Bereiche von meinem Beispiel sind nützlich, aber ich suche nach einem allgemeinen Muster, das auf eine Anwendung angewendet werden kann, wobei einige sehr komplizierte Logik durch Bereiche gesteuert wird.

    
JD Huntington 25.04.2014, 18:28
quelle

4 Antworten

7

Hinzufügen meines ursprünglichen Kommentars als Antwort:

Wie @meagar sagte, können Sie das nicht, weil sie sehr unterschiedliche Dinge tun. Das Maximum, was Sie tun können, ist, dass Ihre Instanzmethode den Bereich aufruft und überprüft, ob es Teil der zurückgegebenen Ergebnisse ist. Dies funktioniert jedoch nicht, wenn die Instanz noch nicht gespeichert wurde. Also in Ihrer Methode könnten Sie tun:

%Vor%     
MrDanA 30.04.2014, 02:32
quelle
8
___ answer23000072 ___

Nein, ist es nicht. Einer erstellt eine Datenbankabfrage, einer arbeitet mit Mitgliedern eines instanziierten Objekts.

    
___ qstnhdr ___ Kann ich einen ActiveRecord-Bereich als Instanzmethode verwenden? ___ answer23000075 ___

Scopes sind nichts als class methods . Sie können dies so definieren

%Vor%     
___ tag123rubyonrails ___ Ruby on Rails ist ein Open-Source-Full-Stack-Webanwendungs-Framework, das in Ruby geschrieben ist. Es folgt dem populären MVC-Framework-Modell und ist bekannt für seinen "convention over configuration" -Ansatz für die Anwendungsentwicklung. ___ tag123activerecord ___ Active Record ist ein Muster, das Domänenlogik mit Speicherabstraktion in einem einzelnen Objekt kombiniert. Verwenden Sie dieses Tag für Fragen zum Muster [rails-activerecord] für Fragen zum Rails ORM-Framework. ___ answer23378695 ___

Hinzufügen meines ursprünglichen Kommentars als Antwort:

Wie @meagar sagte, können Sie das nicht, weil sie sehr unterschiedliche Dinge tun. Das Maximum, was Sie tun können, ist, dass Ihre Instanzmethode den Bereich aufruft und überprüft, ob es Teil der zurückgegebenen Ergebnisse ist. Dies funktioniert jedoch nicht, wenn die Instanz noch nicht gespeichert wurde. Also in Ihrer Methode könnten Sie tun:

%Vor%     
___ answer230000582 ___

Wenn Sie dies wirklich DRY wollen, müssen Sie wahrscheinlich eine Klassenmethode anstelle eines Bereichs verwenden (wie pavan darauf anspielt). Die Klassenmethode kann genauso wie ein Bereich funktionieren und Sie können ein gemeinsames Codebeispiel zur Bestimmung der Attribute und Werte verwenden (z. B. eine Hash-Konstante?).

Aber ich würde empfehlen, dies zu tun. Dieses Abstraktionsniveau zugunsten der DRYness mag etwas übertrieben sein. Es scheint mir, dass Ihre Instanzmethode in einfachere Nachrichten aufgeteilt werden könnte, z. %code% und %code% . Auch, weil das Vergleichen von Streichern generell schlecht / spröde ist. Wie auch immer, im Allgemeinen würde ich erwarten, dass Sie Ihre Objektmethoden und Bereiche anders entwickeln würden. Bereiche sind die Art, wie sie sind, weil Sie eine Datenbank abfragen. Sei also dafür, aber lass deine Objekte weiterhin die bestmöglichen Nachrichten weitergeben!

    
___ tag123namedscope ___ hilf uns, dieses Wiki zu bearbeiten ___ qstntxt ___

Ich habe einen Bereich, der als Filter fungiert. Zum Beispiel:

%Vor%

Da %code% von mehr als einer Bedingung abhängt, möchte ich, dass dies für eine Instanz von %code% als definiert ist:

%Vor%

Ich möchte jedoch wirklich vermeiden, die Logik zwischen der Instanzmethode und dem benannten Bereich zu duplizieren. Gibt es eine Möglichkeit, %code% auf eine Weise zu definieren, die sich einfach auf den Bereich bezieht?

bearbeite

Ich erkenne, dass dies sehr unterschiedliche Konzepte sind (eine ist eine Klassenmethode, eine ist eine Instanzmethode), daher meine Frage. Wie @MrDanA in einem Kommentar erwähnt, ist die nächste, die ich bekommen kann, zu überprüfen, ob der Datensatz, über den ich neugierig bin, im größeren Rahmen existiert, was wahrscheinlich die Antwort ist, nach der ich suche.

Die Antworten zum Trennen verschiedener Bereiche von meinem Beispiel sind nützlich, aber ich suche nach einem allgemeinen Muster, das auf eine Anwendung angewendet werden kann, wobei einige sehr komplizierte Logik durch Bereiche gesteuert wird.

    
___
Pavan 25.04.2014 18:36
quelle
3
___ answer23000072 ___

Nein, ist es nicht. Einer erstellt eine Datenbankabfrage, einer arbeitet mit Mitgliedern eines instanziierten Objekts.

    
___ qstnhdr ___ Kann ich einen ActiveRecord-Bereich als Instanzmethode verwenden? ___ answer23000075 ___

%code% sind nichts als %code% . Sie können dies so definieren

%Vor%     
___ tag123rubyonrails ___ Ruby on Rails ist ein Open-Source-Full-Stack-Webanwendungs-Framework, das in Ruby geschrieben ist. Es folgt dem populären MVC-Framework-Modell und ist bekannt für seinen "convention over configuration" -Ansatz für die Anwendungsentwicklung. ___ tag123activerecord ___ Active Record ist ein Muster, das Domänenlogik mit Speicherabstraktion in einem einzelnen Objekt kombiniert. Verwenden Sie dieses Tag für Fragen zum Muster [rails-activerecord] für Fragen zum Rails ORM-Framework. ___ answer23378695 ___

Hinzufügen meines ursprünglichen Kommentars als Antwort:

Wie @meagar sagte, können Sie das nicht, weil sie sehr unterschiedliche Dinge tun. Das Maximum, was Sie tun können, ist, dass Ihre Instanzmethode den Bereich aufruft und überprüft, ob es Teil der zurückgegebenen Ergebnisse ist. Dies funktioniert jedoch nicht, wenn die Instanz noch nicht gespeichert wurde. Also in Ihrer Methode könnten Sie tun:

%Vor%     
___ answer230000582 ___

Wenn Sie dies wirklich DRY wollen, müssen Sie wahrscheinlich eine Klassenmethode anstelle eines Bereichs verwenden (wie pavan darauf anspielt). Die Klassenmethode kann genauso wie ein Bereich funktionieren und Sie können ein gemeinsames Codebeispiel zur Bestimmung der Attribute und Werte verwenden (z. B. eine Hash-Konstante?).

Aber ich würde empfehlen, dies zu tun. Dieses Abstraktionsniveau zugunsten der DRYness mag etwas übertrieben sein. Es scheint mir, dass Ihre Instanzmethode in einfachere Nachrichten aufgeteilt werden könnte, z. %code% und %code% . Auch, weil das Vergleichen von Streichern generell schlecht / spröde ist. Wie auch immer, im Allgemeinen würde ich erwarten, dass Sie Ihre Objektmethoden und Bereiche anders entwickeln würden. Bereiche sind die Art, wie sie sind, weil Sie eine Datenbank abfragen. Sei also dafür, aber lass deine Objekte weiterhin die bestmöglichen Nachrichten weitergeben!

    
___ tag123namedscope ___ hilf uns, dieses Wiki zu bearbeiten ___ qstntxt ___

Ich habe einen Bereich, der als Filter fungiert. Zum Beispiel:

%Vor%

Da %code% von mehr als einer Bedingung abhängt, möchte ich, dass dies für eine Instanz von %code% als definiert ist:

%Vor%

Ich möchte jedoch wirklich vermeiden, die Logik zwischen der Instanzmethode und dem benannten Bereich zu duplizieren. Gibt es eine Möglichkeit, %code% auf eine Weise zu definieren, die sich einfach auf den Bereich bezieht?

bearbeite

Ich erkenne, dass dies sehr unterschiedliche Konzepte sind (eine ist eine Klassenmethode, eine ist eine Instanzmethode), daher meine Frage. Wie @MrDanA in einem Kommentar erwähnt, ist die nächste, die ich bekommen kann, zu überprüfen, ob der Datensatz, über den ich neugierig bin, im größeren Rahmen existiert, was wahrscheinlich die Antwort ist, nach der ich suche.

Die Antworten zum Trennen verschiedener Bereiche von meinem Beispiel sind nützlich, aber ich suche nach einem allgemeinen Muster, das auf eine Anwendung angewendet werden kann, wobei einige sehr komplizierte Logik durch Bereiche gesteuert wird.

    
___
meagar 25.04.2014 18:36
quelle
0
___ answer23000072 ___

Nein, ist es nicht. Einer erstellt eine Datenbankabfrage, einer arbeitet mit Mitgliedern eines instanziierten Objekts.

    
___ qstnhdr ___ Kann ich einen ActiveRecord-Bereich als Instanzmethode verwenden? ___ answer23000075 ___

good_some_val? sind nichts als good_some_other_val? . Sie können dies so definieren

%Vor%     
___ tag123rubyonrails ___ Ruby on Rails ist ein Open-Source-Full-Stack-Webanwendungs-Framework, das in Ruby geschrieben ist. Es folgt dem populären MVC-Framework-Modell und ist bekannt für seinen "convention over configuration" -Ansatz für die Anwendungsentwicklung. ___ tag123activerecord ___ Active Record ist ein Muster, das Domänenlogik mit Speicherabstraktion in einem einzelnen Objekt kombiniert. Verwenden Sie dieses Tag für Fragen zum Muster [rails-activerecord] für Fragen zum Rails ORM-Framework. ___ answer23378695 ___

Hinzufügen meines ursprünglichen Kommentars als Antwort:

Wie @meagar sagte, können Sie das nicht, weil sie sehr unterschiedliche Dinge tun. Das Maximum, was Sie tun können, ist, dass Ihre Instanzmethode den Bereich aufruft und überprüft, ob es Teil der zurückgegebenen Ergebnisse ist. Dies funktioniert jedoch nicht, wenn die Instanz noch nicht gespeichert wurde. Also in Ihrer Methode könnten Sie tun:

%Vor%     
___ answer230000582 ___

Wenn Sie dies wirklich DRY wollen, müssen Sie wahrscheinlich eine Klassenmethode anstelle eines Bereichs verwenden (wie pavan darauf anspielt). Die Klassenmethode kann genauso wie ein Bereich funktionieren und Sie können ein gemeinsames Codebeispiel zur Bestimmung der Attribute und Werte verwenden (z. B. eine Hash-Konstante?).

Aber ich würde empfehlen, dies zu tun. Dieses Abstraktionsniveau zugunsten der DRYness mag etwas übertrieben sein. Es scheint mir, dass Ihre Instanzmethode in einfachere Nachrichten aufgeteilt werden könnte, z. %code% und %code% . Auch, weil das Vergleichen von Streichern generell schlecht / spröde ist. Wie auch immer, im Allgemeinen würde ich erwarten, dass Sie Ihre Objektmethoden und Bereiche anders entwickeln würden. Bereiche sind die Art, wie sie sind, weil Sie eine Datenbank abfragen. Sei also dafür, aber lass deine Objekte weiterhin die bestmöglichen Nachrichten weitergeben!

    
___ tag123namedscope ___ hilf uns, dieses Wiki zu bearbeiten ___ qstntxt ___

Ich habe einen Bereich, der als Filter fungiert. Zum Beispiel:

%Vor%

Da %code% von mehr als einer Bedingung abhängt, möchte ich, dass dies für eine Instanz von %code% als definiert ist:

%Vor%

Ich möchte jedoch wirklich vermeiden, die Logik zwischen der Instanzmethode und dem benannten Bereich zu duplizieren. Gibt es eine Möglichkeit, %code% auf eine Weise zu definieren, die sich einfach auf den Bereich bezieht?

bearbeite

Ich erkenne, dass dies sehr unterschiedliche Konzepte sind (eine ist eine Klassenmethode, eine ist eine Instanzmethode), daher meine Frage. Wie @MrDanA in einem Kommentar erwähnt, ist die nächste, die ich bekommen kann, zu überprüfen, ob der Datensatz, über den ich neugierig bin, im größeren Rahmen existiert, was wahrscheinlich die Antwort ist, nach der ich suche.

Die Antworten zum Trennen verschiedener Bereiche von meinem Beispiel sind nützlich, aber ich suche nach einem allgemeinen Muster, das auf eine Anwendung angewendet werden kann, wobei einige sehr komplizierte Logik durch Bereiche gesteuert wird.

    
___
pdobb 25.04.2014 18:36
quelle