2017-11-06 3 views
0

So habe ich die folgenden drei Modelle: Assignment.rb, Submission.rb, User.rbRails Active abfragt

Und hier sind die Beziehungen:

class Assignment 
    has_many :submissions 
end 

class Submission 
    belongs_to :assignment 
    belongs_to :user 
    # submission has a boolean column called submitted with val true or false 
end 

class User 
    has_many submissions 
end 

Ich möchte wissen, wie kann ich die Zuordnungen abfragen, die ein Benutzer nicht (sauber) eingereicht? Wenn ein Benutzer eine Zuweisung sendet, wird eine neue Aufgabe für diese Zuweisung und den Benutzer erstellt.

Nicht sicher, ob ich genug Informationen für jedermann zur Verfügung gestellt habe, so kommentieren Sie bitte, wenn noch etwas benötigt wird. Thx!

+1

Die Frage ist verwirrend. Was ist der Unterschied zwischen einer Zuordnung/Benutzer-Kombination ohne Übermittlungsdatensatz im Vergleich zu einer Zuordnung/Benutzer-Kombination mit einem Übermittlungsdatensatz, der übergebeben wurde, auf Falsch gesetzt? – moveson

+0

@moveson Benutzer, der keinen Einreichungsdatensatz für eine Aufgabe hat und bei dem ein Einreichungsdatensatz für eine Aufgabe mit Übergeben auf "False" gesetzt ist, bedeutet, dass der Benutzer noch nicht gesendet hat. – yzhan

+0

Sie möchten also für einen bestimmten Benutzer Zuordnungen festlegen, bei denen entweder (a) eine Submission erstellt wurde, aber eine Submission == false, oder (b) keine Submission erstellt wurde? – moveson

Antwort

2

Die Logik, die @Norly Canarias verwendet, ist richtig, aber ich würde es ändern Methoden auf der Benutzerklasse zu verwenden, und ich würde es auch ändern um es datenbankunabhängig zu machen (zum Beispiel funktioniert die Verwendung von 'submissions.submitted = true' überhaupt nicht in Postgres).

class User < ApplicationRecord 
    has_many :submissions 
    has_many :assignments, through: :submissions 

    def submitted_assignments 
    assignments.where(submissions: {submitted: true}) 
    end 

    def unsubmitted_assignments 
    Assignment.where.not(id: submitted_assignments) 
    end 
end 

Ich habe dies getestet und es funktioniert wie erwartet. Für einen Benutzer, der eine Submission für Aufgabe 1 mit submission == true hat und wer eine Submission für Aufgabe 2 mit submitted == false hat, und vorausgesetzt, es gibt zwei weitere Aufgaben (3 und 4), für die keine Einreichung existiert erhalten:

>> user.submitted_assignments.ids 
#=>[1] 
>> user.unsubmitted_assignments.ids 
#=>[2, 3, 4] 
0

Um alle Zuordnungen zu erhalten, die

@assignments = Assignment.where.not(user_id: user_id) 

Eine saubere Art und Weise, es zu tun nicht von einem bestimmten Benutzer sind, ist ein Rahmen in der Zuordnung Modell

class Assignment 
    has_many :submissions 

    scope :not_from_user, ->(user_id) {where.not(user_id: user_id) } 
end 

Und dann

Aufruf erstellen
@assignments = Assignment.not_from_user 1 
+1

Wie beantwortet das die (etwas verwirrende) Frage? – max

+1

Sorry mein schlechtes für die Verwirrung. Bitte überprüfen Sie die obigen Kommentare, um zu sehen, ob dies den Fall klarer macht. – yzhan

1

Ich denke, so etwas könnte funktionieren (ich habe nicht getestet):

class Assignment 
    has_many :submissions 
end 

class Submission 
    belongs_to :assignment 
    belongs_to :user 
end 

class User 
    has_many :submissions 
    has_many :assignments, through: :submissions 
end 

user   = User.first 
submitted = user.assignments.where('submissions.submitted = true') 
not_submitted = Assignment.where.not(id: submitted) 

Sie können auch einen Bereich machen

class Assignment 
    has_many :submissions 
    scope :not_submitted_by_user, ->(user) do 
    where.not(id: user.assignments.where('submissions.submitted = true')) 
    end 
end 

user = User.first  
not_submitted = Assignment.not_submitted_by_user(user)