JP Silvashy
JP Silvashy

Reputation: 48525

Rails, trouble with scopes

I'm not sure what I'm doing wrong here but I want to create scope for a model I have, but I want it to evaluated a count on a related model... like say:

class Thing < ActiveRecord::Base
  has_many :photos
  scope :with_images, self.photo.count > 0
end

class Photo < ActiveRecord::Base
  belongs_to :thing
end

I should then have a scope which would work like

Thing.where('some conditions').with_images

I get a NoMethodError on photos, why wouldn't this be available as a relation? I don't want to use it as a method.

Upvotes: 1

Views: 63

Answers (2)

Peter Brown
Peter Brown

Reputation: 51697

There are two things going on here. First, you're trying to call photo, instead of photos.

However, the you're still going to get an error because at the time of execution, self refers to the constant Thing, and not an instance of Thing. The declaration has_many :photos defines a method photos for instances of Thing. Therefore, Thing (the constant) doesn't have a method called photos.

tl;dr Just use a :joins argument since it will only find records that have photos

scope :with_images, :joins => :photos

Upvotes: 2

Heikki
Heikki

Reputation: 15417

It should be:

self.photos.count > 0

or if you're using counter cache:

self.photos_count > 0

Upvotes: 1

Related Questions