2016-11-19 3 views
1

Ich bin mir nicht sicher, ob ich gerade nicht das Richtige suche, aber ich suche nach einem Bereich, um dann als Sammlung für eine Auswahlbox zu verwenden.ActiveRecord Scoping mit verschachteltem Objekt

Notebook Modell:

class Notebook < ActiveRecord::Base 
    has_many :notes 
end 

Hinweis Modell:

class Note < ActiveRecord::Base 
    belongs_to :notebook 
end 

Ich habe mehrere Attribute auf eine Notiz, die wichtige Eigenschaft (für diese) ist note_type. Vorläufig kann der note_type check_list, text oder bookmark sein.

Mein Ziel ist es so etwas wie dieses Arbeits hat:

Notebooks.notes_without_check_lists 

zum Umfang nach unten, so kann ein Benutzer nur Wählen Sie aus dem Drop-Down-Notebooks, die enthalten keine notes mit den note_type seiner check_list . Ich bin nur nicht sicher, wo ich die Iteration über jede note durchführen sollte, um zu bestimmen, ob es sich um das übergeordnete Element notebook handelt, das in die Sammlung aufgenommen werden kann.

EDIT
Derzeit habe ich 4 Notebook Aufzeichnungen. Von den vier Datensätzen enthält nur einer eine Notiz mit dem Notizentyp check_list. Dieses Notizbuch enthält insgesamt zwei Noten, von denen nur einer den Notizentyp check_list hat. Da dies zutrifft, möchte ich das gesamte Notebook unabhängig von den anderen Notizen im Notizbuch aus dem Anwendungsbereich ausschließen.

Jede Hilfe wird sicherlich geschätzt.

Antwort

0

Verwendung scope:

class Notebook < ActiveRecord::Base 
    has_many :notes 
    scope :notes_without_check_lists, -> { joins(:notes).where.not(notes: { note_type: 'check_list' }).group('notebooks.id') } 
end 

Grundsätzlich führen Sie eine Datenbank-Abfrage alle Notebooks' Notizen ziehen, wo note_type nicht gleich check_list ist.

EDIT

Nachdem Sie die Frage bearbeitet, hier ist die Lösung Rubin (ineffizient mit großer Sammlung von notebooks/notes zu verarbeiten) mit - denkt immer noch darüber mit Active Lösung:

class Notebook < ActiveRecord::Base 
    has_many :notes 

    def self.notes_without_check_lists 
    all.reject { |notebook| notebook.notes.any? { |note| note.note_type == 'check_list' } } 
    end 
end 
+0

I denke, das ist sehr nahe. Ich bekomme jedoch mehr Datensätze zurück, als die Summe, die ich in der Datenbank habe. Zum Beispiel habe ich insgesamt 4 Notizbuchobjekte, von denen nur eines eine Notiz mit einer Checkliste enthält. Dies gibt alle vier Datensätze sowie eine Kopie des dritten Datensatzes zurück. Ich mache noch mehr Nachforschungen, aber ich wollte dir danken, dass du mich wenigstens irgendwo mit diesem Code versorgt hast. – gr8

+0

Wenn ich 'joins (: notes) .where (Notizen: {note_type: 'check_list'})' verwende, bekomme ich den einen Datensatz zurück, der die Checkliste enthält, so dass das Gegenteil funktioniert. – gr8

+0

@jeepagooster Ich habe die Antwort bearbeitet, notiere den 'group' Teil. Wenn das funktioniert (es wird 100%) stellen Sie sicher, die Antwort zu akzeptieren (achten Sie auf ein Häkchen neben der Antwort Punktzahl) –

Verwandte Themen