2016-06-22 7 views
1

Ich habe ein Benutzermodell.Rails: Mit Service-Klasse Methoden in einem Umfang Abfrage

Ich versuche, meinen Benutzerindex Ansicht festlegen nur die Benutzer zu zeigen, wer einen Onboarding-Prozess abgeschlossen hat.

Mein Ansatz, das zu tun ist:

Index:

<% Users.onboarded.each do |user| %> 

In meinem user.rb habe ich versucht, einen Bereich, für Onboarding zu definieren, wie:

scope :onboarded, -> { where (:user_is_matchable?) } 

I habe eine Methode in meiner Organisation Service-Klasse, die hat:

class UserOrganisationMapperService 

    attr_accessor :user 
private 

    def user_is_matchable? 
    profile.present? && matching_organisation.present? 

    end 

Wenn ich dies versuchen, ich erhalte eine Fehlermeldung, die sagt:

undefined method `onboarded' for Users:Module 

Kann jemand sehen, wo ich falsch gegangen?

+0

Erstens: 'Benutzer' oder 'User' in Ihrem' user.rb' Datei .. Wie lautet der tatsächliche Name der Klasse? weil es 'User' nicht' User' sein sollte –

+0

Sie haben 'onboarded' in' user.rb' definiert, aber Sie rufen es auf 'Users' Modul auf. Sie sollten es stattdessen auf "Benutzer" aufrufen. –

+0

Zweitens: 'scope: onboarded, -> {where (: user_is_matchable?)}' Das wird einfach nicht funktionieren. Ein Bereich ist eine ActiveRecord-Abfrage - er kann nur Details der tatsächlichen Struktur in der Datenbank behandeln. Wenn Sie in Ihrer Benutzertabelle keine * Spalte * mit dem Namen 'user_is_matchable?' haben, wird sich dieser Bereich beschweren und nicht funktionieren. –

Antwort

1

Erstens: Users oder User in Ihrer user.rb Datei .. Was ist der eigentliche Name der Klasse? weil es User sein sollte nicht Users

Zweitens: scope :onboarded, -> { where (:user_is_matchable?) } das wird einfach nicht funktionieren. Ein Bereich ist eine ActiveRecord-Abfrage - er kann nur Details der tatsächlichen Struktur in der Datenbank behandeln. wenn Sie nicht über eine Spalte in Ihrer Benutzer-Tabelle user_is_matchable? genannt haben, dann wird dieser Bereich beschweren und nicht funktionieren.

müssen Sie diesen Rahmen zu etwas machen, die nur auf der Datenbank arbeiten würde.

ich nur raten (Sie haben uns nicht die vollständige Struktur der Beziehungen hier gegeben), aber würden Sie in der Lage sein, so etwas wie zu tun:

scope :onboarded, -> { where ("profile_id IS NOT NULL AND matching_organisation_id IS NOT NULL") } 

???

Alternativ müssen Sie es nur in Ruby laufen lassen - das wird langsamer (besonders wenn Ihre Tabelle sehr groß wird, wie es Benutzer-Tabellen tun). Aber wenn Sie in Ordnung sind damit super langsam ist, dann können Sie dies tun:

class User < ActiveRecord::Base 
    def self.onboarded 
    all.select(&:user_is_matchable?) 
    end 

oder etwas ähnliches ...

+0

Hi - ja, ich könnte diese Idee verwenden. Ich habe keine 'übereinstimmende Organisations-ID' in meiner Datenbank. Ich habe eine Methode, um zu prüfen, ob es eine gibt. Stattdessen könnte ich diese Idee verwenden, aber ich weiß nicht, wie man es in Code schreibt: scope: onboarded, -> {where ("user.profile_id IST NICHT NULL UND user.profile.organization_id IST NICHT NULL")} – Mel

+0

Ich habe das zweite vorgeschlagen (eine Methode für mich selbst).onboarded), aber ich bekomme diesen Fehler: undefinierte Methode 'user_is_matchable? ' für # Mel

+1

@Mel Das liegt daran, 'user_is_matchable?' ist eine private Methode, verschiebe es über die 'private' Deklaration – jamesc