Shane
Shane

Reputation: 59

Rails 4 has_many :through accessing field on join table

I have 3 models:

class User < ActiveRecord::Base
  has_many :user_leave_portfolios
  has_many :leave_portfolios, :through => :user_leave_portfolios
end

class LeavePortfolio < ActiveRecord::Base
  has_many :user_leave_portfolios, dependent: :destroy
  has_many :users, :through => :user_leave_portfolios
end

class UserLeavePortfolio < ActiveRecord::Base
  belongs_to :user
  belongs_to :leave_portfolio

  # this table has an additional field named 'leave_amount'
end

The 'leave_amount' field on the user_leave_portfolio table is used as a user chosen leave amount based on a leave_portfolio

According to documentation and various other blogs and articles, I should be able to access the 'leave amount' field with:

u = User.first
u.leave_portfolios.first.leave_amount

However, I get the following error:

NoMethodError: undefined method `leave_amount' for #LeavePortfolio:0x007f8708e3dbe0

Schema:

create_table "leave_portfolios", force: :cascade do |t|
  t.string   "name",             limit: 255
  t.integer  "calculation_type", limit: 4
  t.integer  "period",           limit: 4
  t.integer  "default_amount",   limit: 4
  t.integer  "organisation_id",  limit: 4
  t.datetime "created_at",                   null: false
  t.datetime "updated_at",                   null: false
end

create_table "user_leave_portfolios", force: :cascade do |t|
  t.integer  "leave_portfolio_id", limit: 4
  t.integer  "user_id",            limit: 4
  t.float    "leave_amount",       limit: 24
  t.datetime "created_at",                    null: false
  t.datetime "updated_at",                    null: false
end

create_table "users", force: :cascade do |t|
  t.string   "email",                  limit: 255, default: "", null: false
  t.string   "encrypted_password",
  .
  .
  .
end

Upvotes: 1

Views: 637

Answers (1)

Pavan
Pavan

Reputation: 33542

You should do

u = User.first
u.user_leave_portfolios.first.leave_amount

as you have leave_amount in user_leave_portfolios not in leave_portfolios.

Upvotes: 1

Related Questions