2017-01-14 4 views
0

Nun habe ich ein Modell mit einem has_many Verein:Rails, Überschreibung Zuordnungsverfahren

class Foo < ApplicationRecord 
    has_many :bars 
end 

Nun, ich weiß, dass wenn ich foo.bars nennen es alle Bars lädt wo foo_idfoo.id ist, nicht wahr? Aber ich möchte es überschreiben, so dass ich bars basierend auf anderen Parametern laden könnte.

Diese answer lehrt irgendwie, wie die << (value) Methode überschrieben wird. Aber ich weiß nicht, wie ich es in meinem Fall anwenden soll.

Wie könnte ich das tun ?? Etwas wie dieses:

class Foo < ApplicationRecord 
    has_many :bars do 
    def bars 
     self.owner = Bar.where(date: foo.date) #just an example 
    end 
    end 
end 

???

+0

Noch nicht wirklich klar, was Sie versuchen zu tun. Soll die Assoziation beispielsweise auf 'foos.date = bars.date' und nicht auf' foos.bar_id = bars.id' basieren? –

+0

Ja !! So etwas .. Wenn ich 'foo.bars' anrufe, möchte ich, dass alle Balken eines bestimmten Datums zurückgegeben werden und nicht alle Balken, die zu' foo' gehören. –

+0

Wollen Sie wirklich eine formelle Assoziation? Vielleicht suchen Sie nur nach einer einfachen Methode ohne die gesamte Assoziationsmaschinerie. –

Antwort

3

Sie können eine Bedingung festgelegt auf dem has_many Attribute wie diese

has_many :bars, -> { where(active: true) } 

Mehr dazu in the guides (section 4.3.3)

+0

Nun, es hilft, danke !! Allerdings möchte ich nicht erweitern, weil ich nur die Bars mit 'active: true' durchsuchen will, nicht alle Bars mit' foo_id: foo.id' und das 'active: true'. Fang mich? –

+0

Nun, nicht genau. Können Sie Ihre Frage vielleicht mit mehr Informationen aktualisieren? – Iceman

0

Es klingt wie Sie nach einem Weg, fragen eine Assoziation Getter außer Kraft zu setzen, so dass es wirkt wie eine einfache scope oder where query stattdessen - nämlich, dass Sie foo.bars eine Reihe von bars, die möglicherweise oder nicht foo gehören kann.

Dies ist eine riesige rote Fahne.

Der springende Punkt bei der #bars Assoziations Getter-Methode als Instanzmethode von Foo aufweisen, ist eine Liste von barszu einem einzelnen Modellobjekt bezogen zurückzukehren. Wenn Sie etwas anderes möchten, definieren Sie das Verhalten woanders.

Theoretisch ist das, was Sie fragen, möglich - nehmen Sie einfach die def bars Strophe aus Ihrem Beispiel aus dem has_many Block und legen Sie sie auf die gleiche Ebene wie alle Ihre anderen Methodendefinitionen. Aber es ist einfach sinnlos.

Bar.where und scope sind gebaut, um zu tun, wonach Sie fragen. Wenn Sie Ihre Anfrage nicht auf eine gegebene Foo beschränken möchten, lassen Sie Foo aus.