Hello, Sorry if this is a noob question. I''m trying to store a hash of values (a user''s music collection) into a single database record without having to have a separate row in the db for each music track the user has in his collection. e.g. User 9 { 12319 => "Artist X: Song Name 1", 12198 => "Artist X: Song Name 2", 19180 => "Artist Y: Song Name 3", 92810 => "Artist Z: Song Name 4" } I''m going serialize this hash with serialize: and store it in a text field. I''d like the create, update_attributes, save, etc. methods that could potentially write to this field to create this hash structure (if none exists), add to the hash structure, or remove an entity from this structure automatically without someone using my model having to manually getting the record, read the hash and adding/deleting from the hash. I''ve thought about the following as options: 1) attr_protected :music_tracks and write a custom accessor to manipulate the hash. 2) overriding the create, update_attributes, save etc. methods of ActiveRecord to manipulate the hash. Am I going about this wrong, or any suggestions on the 2 options? Thanks, Tom -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 5 September 2010 00:31, Tom Fielding <tomfieldingpersonal-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello, > Sorry if this is a noob question. > I''m trying to store a hash of values (a user''s music collection) into a > single database record without having to have a separate row in the db for > each music track the user has in his collection. > e.g. User 9 > { 12319 => "Artist X: Song Name 1", > 12198 => "Artist X: Song Name 2", > 19180 => "Artist Y: Song Name 3", > 92810 => "Artist Z: Song Name 4" }Not answering the question, I know, but I would advise against doing it this way. Have a tracks table, User has_many tracks, Track belongs_to user. Then for a user his tracks are current_user.tracks and for each track the artist and name are track.artist and track.name. You will not have to write all the code you are struggling with, Rails will do it for you. The less code you have to write the better. Colin -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org 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.
You can manipulate data before saving it class User before_save :do_something def do_something // process music_tracks here end end PS: I do not know the purpose of your project, but in general, having a table of songs referred by id seems a better option to me. Song 1 => { band => "Kiss", "title" => "Strutter" } User 1 => [1, 1, 1] User 2 => [1, 1, 1] User 3 => [1, 1, 1] In your case, you will get multiple copies of bloated data spread all over DB if many users listen to the same song over and over again. User 1 => { 1 => "Kiss: Strutter", 2 => "Kiss: Strutter", 3 => "Kiss: Strutter" } User 2 => { 1 => "Kiss: Strutter", 2 => "Kiss: Strutter", 3 => "Kiss: Strutter" } User 3 => { 1 => "Kiss: Strutter", 2 => "Kiss: Strutter", 3 => "Kiss: Strutter" } -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.