92

Rails 4 hat eine Verwarnungswarnung eingeführt, wenn: uniq => true mit has_many: through verwendet wird. Zum Beispiel:Warnung wegen Verfall bei Verwendung von has_many: through: uniq in Rails 4

has_many :donors, :through => :donations, :uniq => true 

ergibt die folgende Warnung:

DEPRECATION WARNING: The following options in your Goal.has_many :donors declaration are deprecated: :uniq. Please use a scope block instead. For example, the following: 

    has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment' 

should be rewritten as the following: 

    has_many :spam_comments, -> { where spam: true }, class_name: 'Comment' 

Was ist der richtige Weg, um die oben has_many Deklaration neu zu schreiben?

Antwort

230

Die Option uniq muss in einen Bereichsblock verschoben werden. Beachten Sie, dass der Umfang Block der zweite Parameter auf has_many sein muss (dh Sie es nicht am Ende der Linie verlassen kann, muss es vor dem :through => :donations Teil bewegt werden):

has_many :donors, -> { uniq }, :through => :donations 

Es kann seltsam aussehen , aber es macht ein wenig mehr Sinn, wenn Sie den Fall betrachten, wo Sie mehrere Parameter haben. Zum Beispiel dieser:

has_many :donors, :through => :donations, :uniq => true, :order => "name", :conditions => "age < 30" 

wird:

has_many :donors, -> { where("age < 30").order("name").uniq }, :through => :donations 
+0

Danke, das funktioniert super! Wo hast du das gefunden? Ich konnte es nirgends in der Dokumentation finden. – mysmallidea

+6

Ich sah es tatsächlich in dem Upgrade zu Rails 4 Buch (es ist in Arbeit): http://www.upgradingtorails4.com/ - konnte es nirgendwo anders finden. –

+2

Es ist schwer, eine prägnante Antwort zu finden. Sie, Sir, verdienen mehr Upvotes. – courtsimas

5

Neben Dylans Antwort, wenn Sie die Zuordnung zu erstrecken, mit einem Modul passieren, stellen Sie sicher, dass Sie es im Bereich Block-Kette (im Gegensatz separat) zu spezifizieren, etwa so:

has_many :donors, 
    -> { extending(DonorExtensions).order(:name).uniq }, 
    through: :donations 

Vielleicht ist es nur ich, aber es scheint sehr unintuitive einen Bereich Block zu verwenden, um eine Assoziation Proxy zu erweitern.

Verwandte Themen