Forum: Ruby on Rails Setting dynamic variables

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Paul B. (Guest)
on 2008-12-18 23:40
How do I set variables dynamically based on a search in the database? I
have a list of 30 words in a table called 'words' with a field
called...words. I would like to loop through them and for each word set
a variable. But I'm not sure how to do that. I've tried this but get an
error:

@thewordlist = Word.find(:all)

      if @thewordlist


        @thewordlist.each do |w|

          "@" + w.word = Publicsurvey.count(:conditions => ["word LIKE
?", w.word])

        end

      end

How should I do this?
Frederick C. (Guest)
on 2008-12-18 23:58
(Received via mailing list)
On 18 Dec 2008, at 21:40, Pål Bergström wrote:

>
> How do I set variables dynamically based on a search in the
> database? I
> have a list of 30 words in a table called 'words' with a field
> called...words. I would like to loop through them and for each word
> set
> a variable. But I'm not sure how to do that. I've tried this but get
> an
> error:
>
Well there's instance_variable_set, but this doesn't sound like a good
idea. What if the work isn't a legal variable name (eg if it has a
hyphen). What if the word is the same as some pre-existing instance
variable ? This also makes it hard to iterate over all the instance
variables set in this way. You'd be far better off bunging all that
data in a hash

Fred
Rob B. (Guest)
on 2008-12-19 00:04
(Received via mailing list)
On Dec 18, 2008, at 4:40 PM, Pål Bergström wrote:
>   if @thewordlist
>     @thewordlist.each do |w|
>       "@" + w.word = Publicsurvey.count(:conditions => ["word
> LIKE ?", w.word])
>     end
>   end
>
> How should I do this?

Yikes!  Not like that; what if one of the words is "thewordlist" ;-)

Word.find(:all) will return something that acts like an Array

@word_counts = {}
Word.find(:all).each do |w|
   @word_counts[w.word] = Publicsurvey.count(:conditions => ["word
LIKE ?", w.word])
end

Then you can process the @word_counts hash however you like.

It seems like you could push the work off to the database with
something like the following if the words don't have any wildcards in
them that would cause LIKE to give a result different that just =.

sql = <<-END
   SELECT words.word, count(publicsurveys.id) as 'count'
   FROM words LEFT OUTER JOIN publicsurveys ON publicsurvey.word =
words.word
   GROUP BY words.word
END

@word_counts = {}
Word.connection.select_all(sql).each {|rowhash|
@word_counts[rowhash['word']] = rowhash['count']}


-Rob

Rob B.    http://agileconsultingllc.com
removed_email_address@domain.invalid
Paul B. (Guest)
on 2008-12-19 00:10
Rob B. wrote:
> On Dec 18, 2008, at 4:40 PM, P�l Bergstr�m wrote:

>
> Then you can process the @word_counts hash however you like.
>
> sql = <<-END
>    SELECT words.word, count(publicsurveys.id) as 'count'
>    FROM words LEFT OUTER JOIN publicsurveys ON publicsurvey.word =
> words.word
>    GROUP BY words.word
> END
>
> @word_counts = {}
> Word.connection.select_all(sql).each {|rowhash|
> @word_counts[rowhash['word']] = rowhash['count']}
>


Perfect :-)
This topic is locked and can not be replied to.