Ruby on Rails Monday, October 3, 2011

On Oct 2, 9:57 pm, Rodrigo <joserodrigofuen...@gmail.com> wrote:
> I want to find all records in a model that contains the email
> "j...@test.com" despite the fact that the email value is within an
> array of hashes. How do I do this?
>
> I have a table of email messages like so:
>
> create_table :emails do |t|
>   t.string :emailMessageId
>   t.datetime :date
>   t.string :subject
>   t.string :gmailMessageId
>   t.string :gmailThreadId
>   t.string :from_hash, :default => nil
>   t.text :to_hash, :default => nil
>   t.text :cc_hash, :default => nil
>   t.integer :contact_id
>
> The email.rb model file says:
>
> class Email < ActiveRecord::Base
>
>   serialize :from_hash, Hash
>   serialize :to_hash, Array
>   serialize :cc_hash, Array
>
> end

There are two major categories of solutions to this - either normalize
the data to more SQL records, or apply a full-text search system.
Michael's already described the SQL solution, so here's the other one.

You might want to consider using Sunspot (http://outoftime.github.com/
sunspot/
) for this - it's got the ability to filter data by
multivalued string fields for exactly this sort of situation. The site
will provide you with setup information, but ultimately you'd end up
with a model like this:

class Email < ActiveRecord::Base
serialize :from_hash, Hash
serialize :to_hash, Array
serialize :cc_hash, Array

searchable do
string :to_emails, :multiple => true do
to_hash.map { |x| x['email'] }
end
...etc...
end
end

Searching is pretty straightforward:

Email.search do
with :to_emails, 'joe@test.com'
end

This will also be a huge help when the inevitable, "Hey, can we search
email TEXT as well?" request comes in. :)

--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 rubyonrails-talk@googlegroups.com.
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.

No comments:

Post a Comment