Pomoc z named scopem

Podpowiedzcie proszę.
Jest tak.
book has many comments
comment belongs to book
comment ma atrybut state który przyjmuje wartości 0 lub 1

Potrzebuje named_scopa, który zwróci mi te booki które mają liczbę komentarzy o statusie 1 wieksza od podanej przez użytkownika wartosci.

book = Book.all c = [] book.each do |b| ile = b.comments.find_all_with_state(1).count if ile > params[:ile] c << b.id end
w tablicy c bedziesz mial ID ksiazkek. Pewnie nie najlepsze rozwiąznie i nie jest to namedscope ale powinno dzialac. Nie testowane, z palca ale idea powinna byc ok

Spróbuj tak:

[code=ruby]has_many :valid_comments, :class_name => “Comment”, :conditions => { :state => 1 }

named_scope :commented_by, lambda { |count|
{ :joins => :valid_comments, :group => ‘posts.id’, :having => [“COUNT(comments.id) >= ?”, count] }
}[/code]
Założyłem, że stan “1”, to komentarz “zaakceptowany”, stąd dla przejrzystości dodatkowy has_many.

Wywołanie:

Post.commented_by(5)

…powinno znaleźć wszystkie posty z min. 5 zaakceptowanymi komentarzami.

Pomysł Gotara doskonale zarżnie każdą co większą aplikację :wink:

A co do meritum: albo będziesz robił wyciągając Book robił odpowiedni COUNT komentarzy o statusie 1, ale też jest to rozwiązanie okrutne dla bazy (złożoność obliczeniowa).
Ja bym zrobił counter-cache, czyli trzymał w Book licznik komentarzy o statusie 1.

No wiem, ale potrzebny mi scope bo to do searchlogica. Może się da? :slight_smile:

No wiem że wydajnościowo śmierć, ale przy takiej relacji nic lepszego mi do głowy nie przeszło jak przerzeźbić cała bazę i sprawdzać, no ale oczywiście dodatkowa tabela trzymająca licznik komentarzy jak najbardziej. Czy te rozwiązanie z named scope wydajnościowo będzie lepsze? Też chyba musi przemulić cąła bazę?

Jak zrobisz counter-cache, to nic prostszego wtedy zrobić scope :slight_smile:

@Tomash; Nawet używam counter_cach do szukania ksiazek o danej ilosci komentarzy i działa świetnie. Teraz musze dodać szukanie ksiazek o danej ilosci komentarzy w pewnym stanie.
Czy istnieja warunkowe counter_cache i czy prawidłowo zmienią wartość przy zmianie statusu komentarza?

Wtedy od razu jest. :slight_smile: np. Book.comments_count_lte

Chyba ze o chodzi o to zebym sobie samemu owego napisal.

Może to sie przyda http://github.com/skojin/counter_cache_with_conditions

Napisałem swojego i działa.
Plugin pewnie też załatwił by sprawę.
Dzięki

Mam pytanie.
W modelu User mam

 named_scope :resourcer, :conditions => { :role => "resourcing" }

a modelu Lead natomiast

 belongs_to :resource_manager, :class_name => "User"

Czy mogę jakoś zmodyfikować deklarację w Leadzie, żeby w danej relacji byli uwzględniani tylko użytkownicy z danym named_scope’m?

EDIT:
Wystarczyło zmienić w modelu Lead:

belongs_to :resource_manager, :class_name => "User", :conditions => { :role => "resourcing" }