Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails find data from association

I don't know if the title of the question is correct.

I have locations, hardware, and hardware_type tables but no nested routes.
I have set up the relationships so that location has_many hardwares and hardware belongs_to hardware_categories along with the reciprocal relationships.

In my locations controller in the show action I have

class LocationsController < ApplicationController
before_action :set_location, only: [:show, :edit, :update, :destroy]

# GET /locations
# GET /locations.json
def index
   @locations = Location.all
end

 # GET /locations/1
 # GET /locations/1.json
 def show
   @hardwares = Hardware.where(:location_id => params[:id])
 end

And in my show page

<% @hardwares.each do |hardware| %>
  <tr>
    <td><%= hardware.name %></td>
    <td><%= hardware.asset_tag %></td>
    <td><%= hardware.serial_number %></td>
    <td><%= hardware.note  %></td>
    <td><%= hardware.hardware_category_id  %></td>
  </tr>
<% end %>

This works and the hardware.hardware_category_id returns the correct number.

I would like to show the name of the hardware_category instead

I thought something like

<td><%= hardware.hardware_category_id.name  %></td>

would work but I get undefined method 'name' for 1:Fixnum
How would I get access to this data

schema

create_table "hardware_categories", force: true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "hardwares", force: true do |t|
  t.string   "name"
  t.string   "asset_tag"
  t.string   "serial_number"
  t.text     "description"
  t.text     "note"
  t.string   "cost"
  t.date     "purchase_date"
  t.date     "warranty_end_date"
  t.date     "eol"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "mdl"
  t.integer  "location_id"
  t.integer  "hardware_category_id"
  t.integer  "manufacturer_id"
  t.integer  "supplier_id"
end
like image 590
Greyhounddad Avatar asked Feb 01 '26 09:02

Greyhounddad


1 Answers

<%= hardware.hardware_category.name %> Is what you need.

No need for the _id. The name of the association is as you defined it in the model. I assume its something like:

belongs_to :hardware_category

I recommend reading this guide, before you try doing much more rails. http://guides.rubyonrails.org/association_basics.html

The reason you are seeing that error, is because the hardware_category_id is exactly that, an Integer(FixNum) and the FixNum class doesn't have a method/attribute called name.

--

Rich Peck edit

A better way to do this will be to use .try to evaluate whether the corresponding hardware_category exists...

<%= hardware.hardware_category.try(:name) %>

... this will prevent any "not found" errors if the corresponding object is non existent.

like image 97
DickieBoy Avatar answered Feb 04 '26 01:02

DickieBoy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!