SQL Caching? Pomoc w czyszczeniu

Dokładnie nie wiem, czy chodzi o SQL Caching, ale nic innego nie przychodzi mi do głowy. Liczę na pomoc.

Otóż mam index, w którym listuję items wg daty przydatności, mam więc wsteczne odliczanie, no i tu problem, otóż w momencie, gdy data przydatności się kończy, dany item nie znika z listy, dopiero restart serwera pomaga, więc musi to siedzieć w pamięci. Co zrobić, aby tego typu cache wyłączyć dla określonej listy.

konstrukcja scope

scope :the_end, where(“ended_at >= ?”, Time.now)

Używam ruby 1.8.2, rails 3.0.5, pg, thin

Z góry dzięki za jakąś podpowiedź lub rozwiązanie tego problemu.

scope :the_end, lambda { where("ended_at >= ?", Time.now) }

lub

def self.the_end where("ended_at >= ?", Time.now) end
To nie kwestia cache, a języka i tego kiedy te wyrażenia są ewaluowane przez interpreter.

[quote=qoobaa]scope :the_end, lambda { where("ended_at >= ?", Time.now) }
lub

def self.the_end where("ended_at >= ?", Time.now) end
To nie kwestia cache, a języka i tego kiedy te wyrażenia są ewaluowane przez interpreter.[/quote]
Dzięki serdeczne za wyjaśnienie.

Generalnie druga metoda (ta bez lambda) jest bardziej wskazana ze względu na fakt, że w 3.1 przekazywanie lambdy do scope jest deprecated.

A nie chodzi przypadkiem o tworzenie hasha opcij findera przekazywanego przez lambde. Sama lambda nie jest deprecated tylko chyba to co zwraca.

Z changeloga wynika, że:

[quote]Passing a proc (or other object that responds to #call) to scope is deprecated. If you need your
scope to be lazily evaluated, or takes parameters, please define it as a normal class method
instead. For example, change this:

class Post < ActiveRecord::Base
  scope :unpublished, lambda { where('published_at > ?', Time.now) }
end

To this:

class Post < ActiveRecord::Base
  def self.unpublished
    where('published_at > ?', Time.now)
  end
end[/quote]

więc chyba nie o to chodzi, choć mogę się mylić.

Nie, masz racje, zastanawiałem się nad tym i faktycznie lambda w scope powodowała mase edge casów w 2.0

Ten deprecation to już nieaktualny :wink: Jednak lambdy zostaną.

O, to przy okazji, może wiesz dlaczego w ogóle była deprecated?

Ja strzelam że to przez problemy przy STI, tam było sporo bugów i workaroundów. Ale to ślepy strzał pewnie :wink:

Były problemy z default_scope i dlatego to chcieli wywalić. Teraz się znalazło lepsze rozwiązanie i między innymi dlatego przywrócili. I z tego co widziałem w komentarzach chodzi też o spójność:

[code]scope :assigned, where(‘assigned_id IS NOT NULL’)
scope :recent, -> { |limit| oder(‘created_at DESC’).limit(limit || 5) }

głupio byłoby wymuszać, żeby tą drugą linijkę zamienić na:

def self.recent(limit = nil)
order(‘created_at DESC’).limit(limit || 5)
end[/code]

:wink:

Jaka jest roznica miedzy uzyciem scope, a metody klasy, tj. miedzy scope :recent a self.recent?

Składnia - pod spodem scope i tak robi z tego metodę klasy.