{"id":36087,"date":"2008-03-30T18:52:00","date_gmt":"2008-03-30T18:52:00","guid":{"rendered":"\/2008\/03\/31\/dynamic-select-boxes-ruby-on-rails"},"modified":"2012-08-11T01:20:44","modified_gmt":"2012-08-11T01:20:44","slug":"dynamic-select-boxes-ruby-on-rails","status":"publish","type":"post","link":"http:\/\/pullmonkey.com\/2008\/03\/30\/dynamic-select-boxes-ruby-on-rails\/","title":{"rendered":"Dynamic Select Boxes – Ruby on Rails"},"content":{"rendered":"
UPDATE: There is a dynamic select boxes for rails 3 tutorial<\/a> now, so if this isn't working for you, check it out.
\n<\/strong>
\nI have seen this asked a lot in the forums, so I thought I would write up a little tutorial.
\nFor this tutorial I am going to have three select boxes. The first select box will be a super category of the next two select boxes and the second select box will be a super category of the third select box. I hope that makes sense. To demonstrate, I thought I would use Genre -> Artist -> Song. So let's get started:
\nCreate your models and build your migrations:<\/p>\n\n\n\n1\r\n<\/tt>2\r\n<\/tt>3\r\n<\/tt>4\r\n<\/tt><\/pre>\n<\/td>\n\n\r\n<\/tt>ruby script\/generate model genre name:string<\/span>\r\n<\/tt>ruby script\/generate model artist name:string<\/span> genre_id:integer<\/span>\r\n<\/tt>ruby script\/generate model song title:string<\/span> artist_id:integer<\/span>\r\n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nPopulate your genres, artists and songs through a migration:<\/p>\n \n\n\n1\r\n<\/tt>2\r\n<\/tt><\/pre>\n<\/td>\n\n\r\n<\/tt>ruby script\/generate migration create_hierarchy\r\n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nContents of migration:<\/p>\n \n\n\n1\r\n<\/tt>2\r\n<\/tt>3\r\n<\/tt>4\r\n<\/tt>5<\/strong>\r\n<\/tt>6\r\n<\/tt>7\r\n<\/tt>8\r\n<\/tt>9\r\n<\/tt>10<\/strong>\r\n<\/tt>11\r\n<\/tt>12\r\n<\/tt>13\r\n<\/tt>14\r\n<\/tt>15<\/strong>\r\n<\/tt>16\r\n<\/tt>17\r\n<\/tt>18\r\n<\/tt>19\r\n<\/tt>20<\/strong>\r\n<\/tt>21\r\n<\/tt>22\r\n<\/tt>23\r\n<\/tt>24\r\n<\/tt>25<\/strong>\r\n<\/tt>26\r\n<\/tt>27\r\n<\/tt>28\r\n<\/tt>29\r\n<\/tt>30<\/strong>\r\n<\/tt>31\r\n<\/tt>32\r\n<\/tt><\/pre>\n<\/td>\n\n\r\n<\/tt>class<\/span> CreateHierarchy<\/span> < ActiveRecord<\/span>::Migration<\/span>\r\n<\/tt> def<\/span> self<\/span>.up\r\n<\/tt> g1 = Genre<\/span>.create(:name<\/span> => "<\/span>Genre 1<\/span>"<\/span><\/span>)\r\n<\/tt> g2 = Genre<\/span>.create(:name<\/span> => "<\/span>Genre 2<\/span>"<\/span><\/span>)\r\n<\/tt> g3 = Genre<\/span>.create(:name<\/span> => "<\/span>Genre 3<\/span>"<\/span><\/span>)\r\n<\/tt>\r\n<\/tt> a1 = Artist<\/span>.create(:name<\/span> => "<\/span>Artist 1<\/span>"<\/span><\/span>, :genre_id<\/span> => g1.id)\r\n<\/tt> a2 = Artist<\/span>.create(:name<\/span> => "<\/span>Artist 2<\/span>"<\/span><\/span>, :genre_id<\/span> => g1.id)\r\n<\/tt> a3 = Artist<\/span>.create(:name<\/span> => "<\/span>Artist 3<\/span>"<\/span><\/span>, :genre_id<\/span> => g2.id)\r\n<\/tt> a4 = Artist<\/span>.create(:name<\/span> => "<\/span>Artist 4<\/span>"<\/span><\/span>, :genre_id<\/span> => g2.id)\r\n<\/tt> a5 = Artist<\/span>.create(:name<\/span> => "<\/span>Artist 5<\/span>"<\/span><\/span>, :genre_id<\/span> => g3.id)\r\n<\/tt> a6 = Artist<\/span>.create(:name<\/span> => "<\/span>Artist 6<\/span>"<\/span><\/span>, :genre_id<\/span> => g3.id)\r\n<\/tt>\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 1<\/span>"<\/span><\/span>, :artist_id<\/span> => a1.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 2<\/span>"<\/span><\/span>, :artist_id<\/span> => a1.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 3<\/span>"<\/span><\/span>, :artist_id<\/span> => a2.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 4<\/span>"<\/span><\/span>, :artist_id<\/span> => a2.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 5<\/span>"<\/span><\/span>, :artist_id<\/span> => a3.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 6<\/span>"<\/span><\/span>, :artist_id<\/span> => a3.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 7<\/span>"<\/span><\/span>, :artist_id<\/span> => a4.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 8<\/span>"<\/span><\/span>, :artist_id<\/span> => a4.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 9<\/span>"<\/span><\/span>, :artist_id<\/span> => a5.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 10<\/span>"<\/span><\/span>, :artist_id<\/span> => a5.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 11<\/span>"<\/span><\/span>, :artist_id<\/span> => a6.id)\r\n<\/tt> Song<\/span>.create(:title<\/span> => "<\/span>Song 12<\/span>"<\/span><\/span>, :artist_id<\/span> => a6.id)\r\n<\/tt> end<\/span>\r\n<\/tt>\r\n<\/tt> def<\/span> self<\/span>.down\r\n<\/tt> | | | | | |