2016-12-17 3 views
2

Ich versuche zu lernen, wie zu schreiben Bereiche in Rails 5.Rails 5 - wie einen Bereich zu schreiben

Ich habe ein Benutzermodell und einen Vorschlag Modell. Die Verbände sind:

Benutzer:

has_many :proposals 

Vorschlag:

belongs_to :user 

In meinem Vorschlag Modell, Im zu versuchen, herauszufinden, wie man einen Rahmen zu schreiben, dass die Vorschläge findet, die dem Benutzer gehören das hat sie erschaffen.

Ich versuche:

scope :proponent, -> { where(user_id: user.id) } 

Ich habe eine Million Variationen dieses versucht, aber ich kann man nicht finden, die funktioniert.

Dieser besondere Versuch gibt diesen Fehler:

2.3.1p112 :001 > Proposal.proponent 
NameError: undefined local variable or method `user' for Proposal (call 'Proposal.connection' to establish a connection):Class 

ich auch versucht:

scope :proponent, -> { where('proposal.user_id = ?', user.id) } 

Der Fehler, den ich aus diesem Versuch erhalten ist:

undefined local variable or method `user' for #<Class:0x007fd3600eb038> 

ich nicht wissen, ob die Fehlermeldung bedeutet, dass das erste oder zweite Mal, dass ich 'Benutzer' in meinem Versuch schrieb, falsch ist. Ich weiß nicht, was "Call" Proposal.connection "bedeutet".

Kann jemand sehen, was ich tun muss, um die Vorschlagstabelle zu überprüfen, um diejenigen zu finden, die zu einem bestimmten Benutzer gehören?

+0

Warum sagen Sie nicht einfach und die Vorteile der Verbände Sie bereits haben und tun 'user.proposals' ? –

+0

Weil ich versuche, Pundit zu benutzen - was Bereiche braucht. – Mel

+0

Ist es [dieser Pundit] (https://github.com/elabs/pundit)? Wenn das der Fall ist, bin ich mir nicht sicher, ob es sich bei den genannten Bereichen um Bereiche für Schienen handelt. Aus der README-Datei heißt es: "Das zweite Argument ist ein Bereich, in dem irgendeine Art von Abfrage durchgeführt werden kann. Es wird normalerweise eine ActiveRecord-Klasse oder eine ActiveRecord :: Relation sein, aber es könnte etwas ganz anderes sein." Die Verwendung von user.proposals sollte also in Ordnung sein. –

Antwort

4

Sie müssen user oder user_id als Argument übergeben, wenn Sie das Oszilloskop aufrufen. Sie können es wie folgt definieren:

scope :proponent, ->(user){ where(user_id: user.id) } 

oder

def self.proponent(user) 
    where user_id: user.id 
end 

Diese sind wirklich die gleiche Sache.

Aufruf Dann ist es:

Proposal.proponent(user) 
# => returns a list of proposals for the specific user 

Hinweis: Dies ist das gleiche wie

proposal = Proposal.find_by(...) 
proposal.user.proposals 
+0

Wenn es den Bereich wie Sie vorschlagen versuchen, erhalte ich einen Fehler, der sagt: falsche Anzahl der Argumente (0 gegeben, 1 erwartet) – Mel

+0

Und ich bekomme den gleichen Fehler, wenn ich versuche, den Umfang zu ändern, wie Sie es geschrieben haben "user_id" innerhalb des ersten Satzes von() – Mel

+0

@Mel Der erste Fehler bedeutet, dass Sie 'Proposal.proponent' anstelle von' Proposal.proponent (user) 'sagen. –