2016-07-28 8 views
1

Ich versuche zu lernen, wie Bereiche in Rails geschrieben werden.Wie schreibe ich einen Bereich in Rails?

Ich habe Modelle für Benutzer, Organisation und Organisation anfordern. Die Verbände sind:

User 
    has_one :organisation 

Organisation 
    belongs_to :owner, class_name: 'User' 
    has_many :organisation_requests 

Organisation_request 
    belongs_to :organisation 

In meiner Organisation Anfrage Modell, ich versuche, einen Bereich zu schreiben, um alle Anfragen Organisation auszusuchen, die zu der Organisation Eigentümer gehören.

scope :same_org, where(:organisation_id => owner.organisation_id) 

Da ist in meinem organisation_requests Controller, ich habe:

def index 
    @organisation_requests = OrganisationRequest.same_org 
end 

ich die oben versucht. Besitzer ist ein Alias ​​für Benutzer. In jeder Organisation wird ein Benutzer als Eigentümer dieser Organisation nominiert. Ich möchte, dass dieser Benutzer einen Index der Organisationsanforderungen erhält, die für die Organisation dieses Eigentümers eingehen.

Kann jemand sehen, was ich hier falsch gemacht habe? Ich verstehe nicht, wie man Scopes schreibt.

+1

Die Syntax verwendet eine Lambda, wie Hasmukh Antwort zeigt. Siehe [http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope](http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods] .html # method-i-scope) –

+0

hey, hast du das gelöst? –

+0

Hallo @AndreyDeineko - Ich versuche immer noch, es zu lösen.Ich habe ein anderes Problem, das mich daran hindert, das Zielfernrohr aufzurufen - also arbeite ich zuerst daran. Ich habe Ihre Notizen und werde aktualisiert, um Ihre Antwort zu akzeptieren, wenn ich es funktioniere. Danke fürs Nachfassen. Ich bin sehr langsam zu lernen ... – Mel

Antwort

2

In Ihrem Modell, das versuchen:

scope :same_org, -> {where(:organisation_id => owner.organisation_id) } 
+0

Falsch. Wie erwarten Sie, dass der Eigentümer "organisation_id" in einer Beziehung hat, in der "Organisation" zu "Eigentümer" gehört? –

1

Die upvoted Antwort ist falsch (nichts Persönliches, @Hasmukh Rathod) - es gibt keine organisation_id Spalte in users Tabelle (es kehrt eigentlich Laster ist - es gibt eine user_id Spalte in organisations Tabelle).

würde ich die folgende Lösung vorschlagen:

scope :same_org, ->(owner_id) { joins(organisation: :user).where(users: { id: owner_id }) } 

die oben Umfang haben, was Sie tun müssen, ist die owner_id als Argument zu übergeben. Ich bin mir sicher, dass es einen Weg gibt, um es zum Laufen zu bringen, ohne ein Argument zur Geltung zu bringen, aber ich bin mir noch nicht sicher, wie (ich bin gerade aufgewacht: D).

So Beispiel:

owner_id = User.find(1).id 
OrganisationRequest.same_org(owner_id) # would give you the expected collection of requests