On Sep 28, 2:49 am, Pål Bergström <[email protected]>
wrote:
> I've made a survey in Rails where I want people to pick three words,
> characteristics for different personality types, from a list of 30 words
> for 20 different visual
> details such as linear, organic, symmetry, etc.
>
> I save each answer for each user, with the visual detail in one column
> and the three words in an array in another column. E.g. for
> Linear a user doing the survey might pick Word1,Word2,Word3.
>
> What would be the best way to count Word1 picked for let's say
> Linearity? That is counting the occurrence.
>
> One way would be:
>
> Survey.count(:conditions => "details = 'linear' AND word like 'Word1%'")
>
> But doing that for each of the 20 visual details and for each of the 30
> words would mean a lot of queries. I suspect the answer is somehow to do
> one search and then fix it with an array or hash method.
>

I think you'd be helped more by having a database schema that matches
what you want to do better. Something like this sketch:

Detail: (id, name, position) acts_as_list, if you need the words to
come up in order

DescriptiveWord: (id, name, position) [similar to above]

SurveyResponse: (id, user_id, detail_id, descriptive_word_id)
(note that your app logic will need to constrain the user to 3 words)

All the usual associations can be set up based on this, and things
like @detail.survey_reponses.count(:group => 'descriptive_word_id')
[counts responses to a particular @detail and returns a hash of
word_id => count; you can get the names with some clever :join usage]
will work out of the box.

--Matt Jones


--~--~---------~--~----~------------~-------~--~----~
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to