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.

Reply via email to