Tuesday, July 23, 2013

[Rails] Re: how to use activemodel collection.build for a has_many :through association



On Sunday, 21 July 2013 13:28:38 UTC-4, James Gray wrote:
Hi all,

In my controller I am doing the following to populate a nested form for a has_many through association:

    def new
       @specification = Specification.new

    Component.find_each.each do |component|
      @specification.component_specifications.build(:component_id => component.id)
    end

 One note on this: I'm not sure what the find_each is getting you here. If there are enough records to make it important to find them in batches, building a new ComponentSpecification for each is going to be a bad idea.


The idea being whenever someone creates or edits a form, it will be populated with all components at that time so that when they save those components that specification will be associated with the newly created specification. The problem I am having is I can't work out how to pass component name to display in my form for the as yet nonexistent component_specification as it is not accessible through the ComponentSpecification model.

My models:

class Specification < ActiveRecord::Base
  attr_accessible :description, :name, :component_specifications_attributes

  validates :name, :presence => true, :uniqueness => true

  has_many :component_specifications
  has_many :components, :through => :component_specifications

  accepts_nested_attributes_for :component_specifications, :allow_destroy => true
end


class ComponentSpecification < ActiveRecord::Base
  attr_accessible :note, :colour, :brand, :components

  has_many :components

 This doesn't match the code you're using above - setting `component_id` isn't going to load this association. Is it possible this should be a belongs_to :component instead?

 
class Component < ActiveRecord::Base
  attr_accessible :description, :name

  belongs_to :component_specifications

 Again, I think this is the wrong way round - I'm guessing your intended data model is that one Specification can have many Components, with ComponentSpecifications acting as a join table...

--Matt Jones

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/46d84917-ef35-4ed3-8a4f-e278b71c3f49%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate