2012-07-16 11 views
31

Mam model obrazu, który zawiera zmienną dla liczby wyświetleń (integer). Liczba wyświetleń jest zwiększana o +1 za każdym razem, gdy ktoś obejrzy obiekt Obraz..increment vs + = 1

W coraz to zrobić, jaka jest różnica między

@picture.view_count += 1 
    @picture.save 

i

@picture.increment(:view_count, by = 1) 

również w przypadku korzystania przyrost jest .save konieczne?

+1

nie powinno być składnia '@ picture.increment (: view_count, 1)'? –

+0

Uważaj na współbieżność !! Twoje oba rozwiązania nie są w tym przypadku bezpieczne! Wyobraź sobie, że dwóch użytkowników uruchamia kod w tym samym czasie. Oba działają z tą samą wartością 'view_count'. Następnie drugi użytkownik nadpisuje wartość pierwszego użytkownika przy zapisie, a końcowa liczba jest mniejsza niż oczekiwana. Powinieneś użyć 'increment_counter' aby tego uniknąć. –

Odpowiedz

45

Poniżej znajduje się źródło increment, które inicjalizuje atrybut na zero, jeśli jest zerowe, i dodaje wartość przekazaną jako (domyślnie 1), nie zapisuje, więc .save jest nadal konieczne.

def increment(attribute, by = 1) 
    self[attribute] ||= 0 
    self[attribute] += by 
    self 
end 
+24

lub możesz użyć metody 'increment!', Jeśli nie chcesz zapisywać jej ręcznie –

+2

To jest trochę przestarzała, nowa metoda to increment_counter – timroman

+0

myślisz, że to coś inkrementującego może być w zasięgu związku? post has_many images, model obrazu posiadający atrybut pozycji, który wymagałby inkrementacji – Ben

4

Powinieneś używać counter_cache. counter_cache pomaga automatycznie zwiększyć liczbę rekordów.

class Picture < ActiveRecord::Base 
    has_many :views 
end 

class View < ActiveRecord::Base 
    belongs_to :picture, counter_cache: true 
end 

zdjęcia tabela musi kolumnę o nazwie views_count, lub użyć własnej nazwy dla tej kolumny, na przykład:

belongs_to :picture, counter_cache: :number_of_views 

Ale ja polecam użyć domyślnej nazwy dla counter_cache kolumny, która jest views_count .

+0

, d wymaga modelu, a więc stołu? czy może być "wyabstrahowany"? – Ben

Powiązane problemy