2016-05-18 9 views
0

Ich habe ein Modell von Container die has_and_belongs_to_many Papers die has_one Status.genannten Bereich überschreiben Attribute Schienen

Ich möchte einen benannten Bereich auf dem Container Modell haben, das mir alle Container mit nur die Papiere gefüllt mit einem bestimmten Satz von Status geben wird.

Ich habe so etwas wie der folgenden (Pseudo-Code) auf dem Container-Modell

scope :by_status, -> (statuses) do { 
    joins(papers:[:paper_statuses]).where('paper_statuses.tag in (?)', statuses) if statuses.present? 
} 

Die Rückkehr, die ich alle Papiere in dem Behälter ist unabhängig vom Status .. aber das seltsame Teil all das ist Status werden zu dem, was ich passiere, solange eines existiert. Was würde dies verursachen und wie kann ich das Überschreiben und Laden aller Papiere in meinem Container-Objekt verhindern, wenn alles, was mich interessiert, diejenigen mit den bestimmten Status sind?

Antwort

0

Durch Erstellen eines benannten Bereichs auf Container Modell erhalten Sie immer alle Containers, die mindestens eine Paper mit gegebenem Status enthalten.

Aber nach dem Anruf @containers.first.papers erhalten Sie alle Papiere dieses Container Objekts unabhängig von ihren (Papier-) Status. Das ist das erwartete Verhalten. Ich habe ähnliche Struktur und ich kann nicht ersetzen, Status in meinen Objekten.

Um sicher zu sein, was los ist, verwenden Sie explain Methode, um Ihre SQL-Abfrage anzuzeigen. Und bitte fügen Sie den Code, den Sie verwenden, um Container Objekte und ihre Papers zu sammeln.

Und letzten Gedanken, wäre es vielleicht besser, den genannten Bereich auf Paper Modell zu verschieben? So können Sie mit dem Code Papers mit Status kümmern uns um Sie sammeln können:

Container.first.papers.by_status(statuses)

Ich hoffe, dass meine Antwort wird Ihnen irgendwie helfen. Prost!

Verwandte Themen