I have a simple parent object having many children. I'm trying to figure out how to use a named scope for bringing back just parents with specific numbers of children.
Is this possible?
class Foo < ActiveRecord::Base
has_many :bars
named_scope :with_no_bars, ... # count of bars == 0
named_scope :with_one_bar, ... # count of bars == 1
named_scope :with_more_than_one_bar, ... # count of bars > 1
end
class Bar < ActiveRecord::Base
belongs_to :foo
end
I'm hoping to do something like Foo.with_one_bar
I could write methods on the parent class for something like this, but I'd rather have the power of the named scope
Called like so:
I would use the counter cache for this. Therefore you need the following migration:
Than you need too change you
Bar
model like this:Now the count of
bars
is cached in thefoo
model, that will speed up your queries for the count ofbars
.Your named_scopes then have too look like this:
That way you can save time counting
bars
for eachfoo
every time you make such a request.I got this idea watching the railscast about counter cache: http://railscasts.com/episodes/23-counter-cache-column
* What's new in Active Record [Rails 4 Countdown to 2013]