Peter Hicks wrote in post #1027558: > I have some data that could be a combination of around 30 values. > Typical > values could be 'TB', 'TF', 'D', 'U', '-D', 'OP', 'RM', or nil. > > Ideally, I'd use the SET data type in PostgreSQL, but ActiveRecord > doesn't > appear to support[1] this. More specifically, I can run a migration on > my > development database, but db/schema.rb contains a comment about an > unsupported data-type. > > I've considered creating 30 columns to model this, however I'm not > convinced > that's efficient. I've also thought about separating each value with a > : > and storing this - for example, ":TF:-D:" - whilst I can query for > "WHERE > foo LIKE '%:D:%'", that probably isn't indexable as it's a text search. > > Can anyone help me to come up with an efficient way to do this in Rails > 3.0.10?
Yes. store this as a bit-mask. Then your query is as efficient using integer comparison. Map your labels to the bit-mask. Example: Constants ----- TB => 1 TF => (1 << 1) D => (1 << 2) U => (1 << 3) MINUS_D => (1 << 4) select * from bar where foo = (TB | D); or select * from bar where foo = 5; -- Posted via http://www.ruby-forum.com/. -- 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.

