Kon Ung
2008-Aug-21 13:38 UTC
Is there a more efficient way to work dropdowns from other t
Hi, all. Just wondering if there is a better dry way to do this: I have an inventory program, that I''m writing to learn rails. It has multiple tables, one of the main ones is called parts. Parts has name, manufacturer, vendor, etc columns. Manufacturer and vendor columns are just storing ids of records from tables Manufacturers and Vendors. So when I''m creating a form in the view for "new" action with the dropdowns I need to first get data from those two table in my controller then iterate in my view to show all the options in the dropdown. This is all fine. My question is - when I save the form it complains that I have no @vendors and @manufacturers in my create method. So I have to do @vendors = Vendor.find(:all) again. It''s not a big performance hit, since I only might have potentially 50 records in each table, but it seems to me I should be able to do @vendors = Vendor.find(:all) once in my controller and then use that in many actions. Please advise. Below are snippets from my code (please excuse crudity): Controller Code : 1. def new 2. @vendors = Vendor.find(:all) 3. @manufacturers = Manufacturer.find(:all) 4. @departments = Department.find(:all) 5. part_status_type = StatusType.find_by_name("part status").id 6. @part_statuses Status.find_all_by_status_type(part_status_type) 7. @part = Part.new 8. end 9. 10. def edit 11. end 12. 13. def create 14. @vendors = Vendor.find(:all) 15. @manufacturers = Manufacturer.find(:all) 16. @departments = Department.find(:all) 17. part_status_type = StatusType.find_by_name("part status").id 18. @part_statuses =Status.find_all_by_status_type(part_status_type) 19. @part = Part.new(params[:part]) 20. if @part.save 21. flash[:notice] = ''Part with id <strong>#'' + @part.id.to_s + ''</strong> added successfully'' 22. redirect_to parts_path 23. else 24. render :action => ''new'' 25. end 26. end View Code : 1. <tr bgcolor="#cccccc"> 2. <td>Vendor</td> 3. <td>Vendor part #</td> 4. </tr> 5. <tr bgcolor="#ffffff"> 6. 7. <td> 8. <%= collection_select("part", "vendor", @vendors, "id", "name") %> 9. </td> 10. <td><%= f.text_field :vendor_specific_id %></td> 11. </tr> 12. <tr bgcolor="#cccccc"> 13. <td>Manufacturer</td> 14. <td>Manufacturer part #</td> 15. </tr> 16. <tr bgcolor="#ffffff"> 17. <td> 18. <%= collection_select("part", "manufacturer", @manufacturers, "id", "name") %> 19. </td> 20. <td><%= f.text_field :manufacturer_specific_id %></td> 21. </tr> -- 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
\"Wolas!\"
2008-Aug-21 14:08 UTC
Re: Is there a more efficient way to work dropdowns from other t
def create @part = Part.new(params[:part]) if @part.save flash[:notice] = ''Part with id <strong>#'' + @part.id.to_s + ''</ strong> added successfully'' redirect_to parts_path else @vendors = Vendor.find(:all) @manufacturers = Manufacturer.find(:all) @departments = Department.find(:all) part_status_type = StatusType.find_by_name("part status").id @part_statuses =Status.find_all_by_status_type(part_status_type) render :action => ''new'' end end The reason for this is the render :action => ''new business. You see, when you create a part, there are 2 ways to go; either you are succesfull or not. If you are then everything is groovy and you redirect_to wherever, the redirect_to, disposes of all your variables (@part, @vendors...) and calls the new action method as if it was the first time. If its not succesfull however, we cant redirect_to because wed loose all the data that the user put in in the first place and restart with a blank form. So we render, which means, grab the view, and render it as if i was that method but do not call the method. that is why you need to initialize the variables again, thats why ive put them in the else statement, so that they only get loaded if you are not succesfull. try this, remove the "duplicate" varianble assignments and create a part that is succesfull, it wont complain. On Aug 21, 2:38 pm, Kon Ung <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Hi, all. > > Just wondering if there is a better dry way to do this: > > I have an inventory program, that I''m writing to learn rails. It has > multiple tables, one of the main ones is called parts. Parts has name, > manufacturer, vendor, etc columns. > Manufacturer and vendor columns are just storing ids of records from > tables Manufacturers and Vendors. So when I''m creating a form in the > view for "new" action with the dropdowns I need to first get data from > those two table in my controller then iterate in my view to show all the > options in the dropdown. This is all fine. My question is - when I save > the form it complains that I have no @vendors and @manufacturers in my > create method. So I have to do @vendors = Vendor.find(:all) again. > > It''s not a big performance hit, since I only might have potentially 50 > records in each table, but it seems to me I should be able to do > @vendors = Vendor.find(:all) once in my controller and then use that in > many actions. > > Please advise. Below are snippets from my code (please excuse crudity): > > Controller > > Code : > > 1. def new > 2. @vendors = Vendor.find(:all) > 3. @manufacturers = Manufacturer.find(:all) > 4. @departments = Department.find(:all) > 5. part_status_type = StatusType.find_by_name("part status").id > 6. @part_statuses > Status.find_all_by_status_type(part_status_type) > 7. @part = Part.new > 8. end > 9. > 10. def edit > 11. end > 12. > 13. def create > 14. @vendors = Vendor.find(:all) > 15. @manufacturers = Manufacturer.find(:all) > 16. @departments = Department.find(:all) > 17. part_status_type = StatusType.find_by_name("part status").id > 18. @part_statuses =Status.find_all_by_status_type(part_status_type) > 19. @part = Part.new(params[:part]) > 20. if @part.save > 21. flash[:notice] = ''Part with id <strong>#'' + @part.id.to_s + > ''</strong> added successfully'' > 22. redirect_to parts_path > 23. else > 24. render :action => ''new'' > 25. end > 26. end > > View > > Code : > > 1. <tr bgcolor="#cccccc"> > 2. <td>Vendor</td> > 3. <td>Vendor part #</td> > 4. </tr> > 5. <tr bgcolor="#ffffff"> > 6. > 7. <td> > 8. <%= collection_select("part", "vendor", @vendors, "id", > "name") %> > 9. </td> > 10. <td><%= f.text_field :vendor_specific_id %></td> > 11. </tr> > 12. <tr bgcolor="#cccccc"> > 13. <td>Manufacturer</td> > 14. <td>Manufacturer part #</td> > 15. </tr> > 16. <tr bgcolor="#ffffff"> > 17. <td> > 18. <%= collection_select("part", "manufacturer", @manufacturers, > "id", "name") %> > 19. </td> > 20. <td><%= f.text_field :manufacturer_specific_id %></td> > 21. </tr> > -- > Posted viahttp://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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
Kon Ung
2008-Aug-21 14:52 UTC
Re: Is there a more efficient way to work dropdowns from other t
> The reason for this is the render :action => ''new business. You see, > when you create a part, there are 2 ways to go; either you are > succesfull or not. If you are then everything is groovy and you > redirect_to wherever, the redirect_to, disposes of all your variables > (@part, @vendors...) and calls the new action method as if it was the > first time. If its not succesfull however, we cant redirect_to because > wed loose all the data that the user put in in the first place and > restart with a blank form. So we render, which means, grab the view, > and render it as if i was that method but do not call the method. that > is why you need to initialize the variables again, thats why ive put > them in the else statement, so that they only get loaded if you are > not succesfull. > > try this, remove the "duplicate" varianble assignments and create a > part that is succesfull, it wont complain.Thanks "Wolas!" It does help in this particular case. But I was also wondering in general what''s the best way or any other way to do? Globals? -- 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Kon Ung
2008-Aug-21 14:57 UTC
Re: Is there a more efficient way to work dropdowns from other t
A better example might be with these 2 tables: class CreatePurchaseOrders < ActiveRecord::Migration def self.up create_table :purchase_orders do |t| t.string :status_id t.integer :submitted_by t.integer :ordered_by t.integer :approved_by t.text :comments t.integer :vendor_id t.string :vendor_specific_po_id t.timestamps end end def self.down drop_table :purchase_orders end end orders_by, submitted_by, and approved_by - all refer to Users table - and potenttially one person, or multiple so how do I setup association in this case? -- 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
deegee
2008-Aug-21 15:26 UTC
Re: Is there a more efficient way to work dropdowns from other t
On 21 aug, 16:57, Kon Ung <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> A better example might be with these 2 tables: > > class CreatePurchaseOrders < ActiveRecord::Migration > def self.up > create_table :purchase_orders do |t| > t.string :status_id > t.integer :submitted_by > t.integer :ordered_by > t.integer :approved_by > t.text :comments > t.integer :vendor_id > t.string :vendor_specific_po_id > > t.timestamps > end > end > > def self.down > drop_table :purchase_orders > end > end> > orders_by, submitted_by, and approved_by - all refer to Users table - > and potenttially one person, or multiple so how do I setup association > in this case?You can add many belongs_to clauses with different names all referring to the same class: class PurchaseOrder < AR::Base belongs_to :submitter, :class_name => "User", :foreign_key => :submitted_by belongs_to :orderer, :class_name => "User", :foreign_key => :ordered_by belongs_to :approver, :class_name => "User", :foreign_key => :approved_by end and then it''s possible to make the following queries on a @purchase_order instance: @purchase_order.submitter # => the user that is referenced by submitted_by.> -- > Posted viahttp://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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@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 -~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Aug-21 15:32 UTC
Re: Is there a more efficient way to work dropdowns from other t
On 21 Aug 2008, at 15:57, Kon Ung wrote:> > A better example might be with these 2 tables: > > > class CreatePurchaseOrders < ActiveRecord::Migration > def self.up > create_table :purchase_orders do |t| > t.string :status_id > t.integer :submitted_by > t.integer :ordered_by > t.integer :approved_by > t.text :comments > t.integer :vendor_id > t.string :vendor_specific_po_id > > > t.timestamps > end > end > > def self.down > drop_table :purchase_orders > end > end > > > > > orders_by, submitted_by, and approved_by - all refer to Users table - > and potenttially one person, or multiple so how do I setup > association > in this case?http://www.spacevatican.org/2008/5/6/creating-multiple-associations-with-the-same-table The convention in rails would be for submitted_by etc... to be submitted_by_id and for the association to be submitted_by (weird shit happens if an association and a column have exactly the same name) Fred --~--~---------~--~----~------------~-------~--~----~ 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-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---