Find unused items

This works, but I am sure there is a better way todo this:

  # GET /posts/1/edit   def edit     @post = Post.find(params[:id])     # Find user galleries that have not been used in posts yet     usergalleries = Array.new     @post.user.galleries.each do |pug|       usergalleries << pug.id     end     userpostgalleries = Array.new     @post.user.posts.each do |pup|       userpostgalleries << pup.gallery_id     end     aug = usergalleries - userpostgalleries     @availableusergalleries = @post.user.galleries.find (:all, :conditions => { :id => aug })   end

Any ideas?

Regards Arwed

Quoting arwed <af@bbp.biz>:

This works, but I am sure there is a better way todo this:

  # GET /posts/1/edit   def edit     @post = Post.find(params[:id])     # Find user galleries that have not been used in posts yet     usergalleries = Array.new     @post.user.galleries.each do |pug|       usergalleries << pug.id     end     userpostgalleries = Array.new     @post.user.posts.each do |pup|       userpostgalleries << pup.gallery_id     end     aug = usergalleries - userpostgalleries     @availableusergalleries = @post.user.galleries.find (:all, :conditions => { :id => aug })   end

Any ideas?

# @post = Post.find(params[:id])      @post = Post.find(params[:id], :include => {:user => [:galleries, :posts]})

# One database call instead of many. I think this is correct form, but # have no easy way to test it.

# # Find user galleries that have not been used in posts yet # usergalleries = Array.new # @post.user.galleries.each do |pug| # usergalleries << pug.id # end      user_galleries = @post.user.galleries.map{|pug| pug[:id]}

# I find pug[:id] more reliable than pug.id; the latter in some contexts is # interpreted as the Object id, instead of the primary key/ID from the # database and a deprecation warning is given.

# userpostgalleries = Array.new # @post.user.posts.each do |pup| # userpostgalleries << pup.gallery_id # end      user_post_galleries = @post.user.posts.map{|pup| pup.gallery_id}

     aug = usergalleries - userpostgalleries # @availableusergalleries = @post.user.galleries.find(:all, :conditions => { :id => aug })      @availableusergalleries = @post.user.galleries.find(aug)

# ActiveRecord.find will take an array of IDs.

Another way that takes less memory (if speed is of more concern, benchmark both):

    aug = @post.user.galleries.map{|pug| pug[:id]}     @post.user.posts.each{|pup| aug.delete(pup.gallery_id)}

    @availableusergalleries = Gallery.find(aug)

HTH,   Jeffrey

Hi Jeffrey,

thanks a lot for your help. You made my day!

Regards Arwed