Hi everybody, I have a line of the form: x = hash1.reject{ |key,value| !value}.keys.join('','') That worked fine but then I needed to do the same thing for hash2. So I had to add another line like so: y = hash2.reject{ |key,value| !value}.keys.join('','') I''m trying go DRY but I can''t think of an elegant way to do it -- I''m a relative beginner in ruby. A function is an obvious candidate, but that''s probably my php thinking. Any better way to avoid the repetition? Some fancy loop? Thanks! Sergei --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Unless you wanted to add that method to the Hash class, you could easily do: [hash1, hash2].collect{|hash| hash.reject{ |key,value| ! value}.keys.join('','')} Which would give you an array of the new hashes. If you wanted to assign these values to x and y: x,y = [hash1, hash2].collect{|hash| hash.reject{ |key,value| ! value}.keys.join('','')} On Sep 18, 12:19 pm, surge <gera...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi everybody, > > I have a line of the form: > > x = hash1.reject{ |key,value| !value}.keys.join('','') > > That worked fine but then I needed to do the same thing for hash2. So > I had to add another line like so: > > y = hash2.reject{ |key,value| !value}.keys.join('','') > > I''m trying go DRY but I can''t think of an elegant way to do it -- I''m > a relative beginner in ruby. A function is an obvious candidate, but > that''s probably my php thinking. Any better way to avoid the > repetition? Some fancy loop? > > Thanks! > Sergei--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Sep 19, 12:19 am, surge <gera...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi everybody, > > I have a line of the form: > > x = hash1.reject{ |key,value| !value}.keys.join('','') > > That worked fine but then I needed to do the same thing for hash2. So > I had to add another line like so: > > y = hash2.reject{ |key,value| !value}.keys.join('','') > > I''m trying go DRY but I can''t think of an elegant way to do it -- I''m > a relative beginner in ruby. A function is an obvious candidate, but > that''s probably my php thinking. Any better way to avoid the > repetition? Some fancy loop? > > Thanks! > SergeiPerhaps extending Hash would help: # lib/hash.rb class Hash def get_non_empty_keys # use whatever name is appropriate self.reject{|k, v| !v}.keys.join('','') end end # config/environment.rb require "lib/hash.rb" You can now use the get_non_empty_keys function on your hashes: x = hash1.get_non_empty_keys y = hash2.get_non_empty_keys --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Erol, that''s so cool. I like your solution a lot. What about this one: I allow users to filter tickets based on the module (I call them components) they report on. The list of components comes in as an array. Here''s what I do. # Get a list of components @components = Component.find :all # This is the hash that will be used in a SQL statement. It will become clear in a second. @filter_components = {} # Initialize all components to true (this is the default -- we show tickets for all components) @components.each { |component| @filter_components[component.id] true } if request.xhr? @components.each do |component| # Shouldn''t happen, but if so, empty @filter_components. This means no tickets will be selected. if params[:filter_components].empty? @filter_components = {} break; end if (params[:filter_components]).include?(component.id.to_s) @filter_components[component.id] = true else @filter_components[component.id] = false end end # Make sure at least one component is in @filter_components so that we don''t have special cases. @filter_components[0] = true if @filter_components.size == 0 end # Now comes the line about which I was asking in my previous email. The result of it is used in an IN() part of a SQL query components = @filter_components.reject{ |key,value| ! value}.keys.join('','') It works but it''s a lot of code and the problem is I need to do the same for statuses! Any way to reduce this and make it reusable for statuses? BTW, the reason why I''m not using params[:filter_components] directly in the SQL query (e.g. params[:filter_components].join('','')) is so that the data from the web is not used in a SQL query directly. Make sense? Thanks!!! P.S.: I typed this twice! The first version of this was lost. Bummer. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Sep 18, 6:53 pm, surge <gera...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Erol, that''s so cool. I like your solution a lot. > > What about this one: > > I allow users to filter tickets based on the module (I call them > components) they report on. The list of components comes in > as an array. Here''s what I do. >Why aren''t you just doing Ticket.find :all, :conditions => {:component_id => params[:component_ids}} ? Fred --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Sep 19, 2:25 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Why aren''t you just doing Ticket.find :all, :conditions => > {:component_id => params[:component_ids}} ?I''d go with this one from Fred. No need to worry about using the params[:component_ids] directly in the finder, the input is being sanitized by Rails before being used in the SQL, much like :conditions => [''field = ?'', value] is. It generates an IN() condition if params[:component_ids] is an array or an IS NULL condition if params[:component_ids] is nil. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
I thought it would be perfect too, but there''s a slight problem. The limitation is that that form assumes everything as AND''ed. This is what I came up with yesterday: @tickets = Ticket.find :all, :conditions => [ "((assignee_id IS NULL AND reporter_id = :reporter_id) OR assignee_id = :assignee_id) AND tickets.status_id IN(:statuses) AND tickets.component_id IN(:components)", { :assignee_id => user.id, :reporter_id => user.id, :statuses => @filter_statuses, :components => @filter_components } ] See that OR? I think because of it I can''t use the suggested by Frederick form. And with the form presented here, I couldn''t say tickets.component_id = :components. Rails didn''t transform the equal sign into an "IN" although it did translate the array of component ids into a comma separated list. But it works nonetheless if I put IN inside the string. Then, if components are empty, it correctly replaces the variable with a NULL. And I think everything is properly escaped as well. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---