Search code examples
ruby-on-railsdatabasemultiple-databasestable-relationships

Rails database relationships


I have three models that I want to interact with each other.

Kase, Person and and Company.

I have (I think) setup the relationships correctly:

class Kase < ActiveRecord::Base
#HAS ONE COMPANY
has_one :company

#HAS MANY PERSONS
has_many :persons


class Person < ActiveRecord::Base
belongs_to :company

class Company < ActiveRecord::Base
has_many :persons
def to_s; companyname; end

I have put the select field on the create new Kase view, and the create new Person view as follows:

<li>Company<span><%= f.select :company_id, Company.all %> </span></li>

All of the above successfully shows a drop down menu dynamically populated with the company names within Companies.

What I am trying to do is display the contact of the Company record within the kase and person show.html.erb.

For example, If I have a company called "Acme, Inc." and create a new Kase called "Random Case" and choose within the create new case page "Acme, Inc." from the companies drop down menu. I would then want to display "Acme, Inc" along with "Acme, Inc. Mobile" etc. on the "Random Case" show.html.erb.

I hope this makes sense to somebody!

Thanks,

Danny

EDIT: kases_controller

def show
@kase = Kase.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @kase }
  format.pdf { render :layout => false }

  prawnto :prawn => { 
             :background => "#{RAILS_ROOT}/public/images/jobsheet.png",

             :left_margin => 0, 
             :right_margin => 0, 
             :top_margin => 0, 
             :bottom_margin => 0, 
             :page_size => 'A4' }
end   end

Solution

  • I think your model associations are incomplete based on what you've posted in your question:

    class Kase < ActiveRecord::Base
      has_one :company
      has_many :people # Rails should handle the correct plural here
    end
    
    class Company < ActiveRecord::Base
      has_many :people
      belongs_to :kase
    end
    
    class Person < ActiveRecord::Base
      belongs_to :company
      belongs_to :kase
    end
    

    With the assocations set up correctly, you can then access a company's attributes for a given case:

    kase.company.name
    kase.company.mobile
    

    —or for a given person:

    person.company.name
    person.company.mobile
    

    You can even get to the company via a person's case:

    person.kase.company.name # etc...