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-0WR/Tm5k6cQ@public.gmane.org>:> > 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 On 24 Aug., 00:04, "Jeffrey L. Taylor" <r...-f/t7CGFWhwGcvWdFBKKxig@public.gmane.org> wrote:> Quoting arwed <a...-0WR/Tm5k6cQ@public.gmane.org>: > > > > > > > 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