has_many :through

Hi all,

I’ve been stuck trying to get a has_many :through relationship working on my Rails application.

I have a Employee model, a Timesheet model and a Payment model.

The Employee has many Timesheets and a Timesheet has many Employees.

The Timesheet table will contain its ID and a Date. the Payment model is the join table, it belongs to a Employee and a Timesheet, it also has an extra field called hours_worked.

See below models

class Timesheet < ActiveRecord::Base
    belongs_to :    user
has_many :    payments
has_many :employees, :through => :payments

class Employee < ActiveRecord::Base
    belongs_to :    user
has_many :    payments
has_many :timesheets, :through => :payments end

class Payment < ActiveRecord::Base
    belongs_to :    employee
belongs_to :timesheet

I want to create a form where I can create a new Timesheet by chosing a date, listing all Employees and allowing me to enter the hours_worked for each employee.
Once I submit the form, it should create a new Timesheet, and create a Payment for each employee with each employee's hours_worked for that specific Timesheet.
I hope this makes sense and I can get your help!!

So what is not working, or which bit don't you know how to do?

Have you worked right through a good tutorial such as railstutorial.org?


Hi Colin,

What I don’t know how to do is the nested form, and the new and created methods in the controller for this specific association.

I have tried the relationship on the rails console and it works fine.

I actually have done the rails tutorial and had a good look through stackoverflow, but i still can’t get my head around this one.

Appreciate your help!

My intention is to create a form along those lines:

<%= form_for(@timesheet, :html => {:multipart => true}) do |f| %>
    <!--creates a new timesheet -->
    <%= f.label "Enter date for timesheet" %>
    <%= f.text_field :date %>
    <%= fields_for :payment do |p| %>
    <!-- Add worked hours for each employee -> @employee = Employee.all on controller (new method)-->
    <% @employee.each do |t| %>
          <%= t.fname  %>
          <br />
          <%= f.label "Basic Hours" %>
          <%= p.text_field :hours  %>
          <br />
    <% end %>

    <%= f.submit 'Submit', :class => 'btn btn-primary' %>

<% end %>


My issue is I can’t find a way to get this form to create the timesheet and the payment for each employee.

Hopes this makes it a bit easier to understand.


Are you sure you don't mean a Timesheet has *one* Employee?

Do you mean by having a Timesheet that has a employee id, the date and the hours worked?

On Tue, Apr 7, 2015 at 8:41 AM, Bruno Walraven
<brunowalraven@gmail.com> wrote (rearranged to proper order):

Thanks for that Dave! Sometimes we over complicate stuff when learning :slight_smile:

I just need to look into creating a form that will allow me to select a date for the timesheet, and then loop through all employees on the database to give me a option to create a timesheet for each employee using that specific date, all in one form.

The form will also allow me to enter the hours worked for each employee. When I submit the form, it should create a timesheet for each employee with their worked hours for that specific date.

a little help with the form and new/create methods would be a great help!

Thanks again…