2016-02-03 44 views
2

我不知道問題的標題是否正確。Rails從關聯中找到數據

我有位置,硬件和hardware_type表,但沒有嵌套的路線。 我已經建立了關係,以便位置has_many硬件和硬件屬於hardware_categories以及相互關係。

在表演動作我的位置控制器我有

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 | 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」 end`

+1

看來你是Rails的新手。在直接進入堆棧溢出之前,你應該先嚐試一下非常基本的東西。 – punitcse

+0

@punitcse我是新來的鐵軌。我認爲這會變得更加複雜。我嘗試了大多數.notation的組合,除了工作之外。我一直在想,我們需要通過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的方法/屬性。

-

豐富派克編輯

一個更好的辦法來做到這一點使用起來會.try來評估相應hardware_category是否存在...

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

...如果相應的對象不存在,這將防止任何「未找到」錯誤。

0

hardware.hardware_category_id.name找到hardware_category_id,然後您找到該id的名稱。

在這種情況下hardware.hardware_category_id == 1

所以你打電話1.name和1是一個fixnum,並沒有方法名稱,你會得到未定義的方法name1:Fixnum error

您可以在硬件中創建一個名爲hardware_category_name的新字段,然後致電hardware.hardware_category_name