92

Rails 4 wprowadził ostrzeżenie o wycofaniu, gdy: uniq => true with has_many: through. Na przykład:Ostrzeżenie o przestoju podczas używania has_many: through: uniq in Rails 4

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

uzyskuje się następujące ostrzeżenie:

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' 

Co to jest poprawny sposób przepisać Powyższa deklaracja has_many?

Odpowiedz

230

Opcja uniq musi zostać przeniesiona do bloku zakresów. Zauważ, że blok zakres musi być drugi parametr do has_many (czyli nie można zostawić go na końcu linii, to musi być przeniesiona przed :through => :donations części):

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

To może wyglądać dziwnie , ale ma to trochę więcej sensu, jeśli weźmiesz pod uwagę przypadek, w którym masz wiele parametrów. Na przykład w ten sposób:

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

staje:

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

Dzięki, działa to świetnie! Gdzie to znalazłeś? Nie udało mi się znaleźć go w dokumentacji w dowolnym miejscu. – mysmallidea

+6

Tak naprawdę widziałem to w książce Aktualizacja do Rails 4 (jest w toku): http://www.upgradingtorails4.com/ - nie udało się jej znaleźć nigdzie indziej. –

+2

Trudno znaleźć odpowiedź w sposób zwięzły. Panu, zasługujesz na więcej awansów. – courtsimas

5

Oprócz Dylans odpowiedź, jeśli zdarzy ci się być rozszerzenie skojarzenie z modułem, upewnij się, że łańcuch go w bloku Zakres (w przeciwieństwie do określania go osobno), tak jak poniżej:

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

Może jej tylko mnie, ale wydaje się bardzo nieintuicyjne używać blokady zakres rozszerzyć proxy asocjacji.

Powiązane problemy