simple select

Hi all,

I have two models gallery and photo (has_many -> belongs_to).
Can I use this to find the primary photo for the given gallery?

@gallery = @user.galleries
@primary_photo = @gallery.photos.find_by_primary(true).first

it ends with error.

Thanks for any help.
P.

Hi all,

I have two models gallery and photo (has_many -> belongs_to).
Can I use this to find the primary photo for the given gallery?

@gallery = @user.galleries
@primary_photo = @gallery.photos.find_by_primary(true).first

find_by_xxx returns a single object (or nil) so that call to first is
superfluous.

Fred

the correct call is:
@primary_photo = @gallery.photos.find(:first, :conditions => {:primary
=> true})

or (but thats an old one and i don't know if that isn't deprecated):
@primary_photo = @gallery.photos.find_first_by_primary(true)

or you could add a named_scope to your photo-model:
  named_scope :primary, :conditions => { :primary => true }

then your call could be like:
  @primary_photo = @gallery.photos.primary.first

this should be the nicest alternative.

It looks from your code as if you’re returning a list of user galleries rather than a single one, so the list you get won’t have a photos method. Does your code work if you change the third line in your method to

@gallery = @user.galleries.first

Eifion

http://asciicasts.com

Twitter: @eifion

Eifion Bedford wrote:

It looks from your code as if you're returning a list of user galleries
rather than a single one, so the list you get won't have a photos
method.
Does your code work if you change the third line in your method to

@gallery = @user.galleries.first

Yes, thats the error.
Now it is working but just for the first one.

Is there a way to loop all of the users galleries?
Thank you.

P.

well if you want all the primary photos just use my suggested
named_scope. then you can ask:
  @all_primary_photos = Photo.all.primary # or just Photo.primary
  @all_galleries = Gallery.all
no loop needed. but if you want to loop, you can do that with
  @all_galleries.each do |gallery|
    # gallery.photos
  end