2016-02-03 5 views
2

Я не знаю, правильно ли задан вопрос.Rails найти данные из ассоциации

У меня есть места, оборудование и таблицы hardware_type, но нет вложенных маршрутов. Я установил отношения так, чтобы местоположение has_many аппаратное обеспечение и аппаратное обеспечение принадлежало аппаратным_категориям вместе с взаимными отношениями.

в моем контроллере мест в шоу действий у меня есть

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 

и в моем шоу-странице

<% @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 %> 

Это работает и hardware.hardware_category_id возвращает правильное число.

Я хотел бы показать имя hardware_category вместо

Я думал, что-то вроде

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

будет работать, но я получаю неопределенный метод `имя» для 1: Fixnum, как я мог бы получить доступ к эти данные

schema `create_table" hardware_categories ", force: true do | t | t.string "имя" t.datetime "created_at" t.datetime "updated_at" конец

create_table "" металлические изделия, сила: верно ли | т | t.string "имя" t.string "asset_tag" t.string "serial_number" t.text "Описание" t.text "примечание" t.string "стоимость" t.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" т .integer "manufacturer_id" t.integer "supplier_id" конец`

+1

Кажется, что вы новичок в Rails.It очень простая вещь, которую вы должны сначала попробовать, прежде чем сразу положить в переполнение стека. – punitcse

+0

@punitcse Я новичок в рельсах. Я думал, что это будет сложнее. Я пробовал большинство комбинаций .notation excepy того, который работал. Я думал, что нам нужно добраться до другого стола через id feild, а затем уже – Greyhounddad

ответ

1

<%= hardware.hardware_category.name %> Это то, что вам нужно.

Нет необходимости в _id. Имя ассоциации определяется так, как вы ее определили в модели. Я предполагаю, что его что-то вроде:

belongs_to :hardware_category

Я рекомендую прочитать это руководство, прежде чем вы попытаетесь сделать гораздо более рельсы. http://guides.rubyonrails.org/association_basics.html

Причина вы видите эту ошибку, потому, что hardware_category_id точно, что целое число (Fixnum) и класс Fixnum не имеет метод/атрибут называется name.

-

Rich Пек редактировать

Лучший способ сделать это будет использовать .try оценить, существует ли соответствующий hardware_category ...

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

... это предотвратит любые ошибки «не найдены», если соответствующий объект не существует.

0

hardware.hardware_category_id.name находит hardware_category_id, тогда вы найдете имя этого идентификатора.

В данном случае hardware.hardware_category_id == 1.

Так вы звоните 1.name и, как 1 является Fixnum, и не имеет имя метода, вы получаете неопределенный метод name для 1:Fixnum error.

Вы можете создать новое поле в оборудовании под названием hardware_category_name, а затем позвонить hardware.hardware_category_name.

Смежные вопросы