2011-11-03 5 views
1

스키마 :레일, has_many, belongs_to

create_table "reports", :force => true do |t| 
    t.integer "user_id" 
    t.string "apparatus" 
    t.string "capt" 
    t.text  "body" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    create_table "users", :force => true do |t| 
    t.string "login",      :limit => 40 
    t.string "name",      :limit => 100, :default => "" 
    t.string "email",      :limit => 100 
    t.string "crypted_password",   :limit => 40 
    t.string "salt",      :limit => 40 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "remember_token",   :limit => 40 
    t.datetime "remember_token_expires_at" 
    t.string "rank" 
    t.integer "shift" 
    t.integer "access" 
    end 

사용자 모델 :

Class User < ActiveRecord::Base 
    has_many :reports 
# bunch of other stuff thats not important 
end 

보고서 모델 :

Class Report < ActiveRecord::Base 
    belongs_to :user 
end 

보기/보고서/인덱스

<% @reports.each do |report| %> 
    <tr> 
    <td><%= report.user_id %></td> #  ****THIS IS THE LINE IN QUESTION**** 
    <td><%= report.apparatus %></td> 
    <td><%= report.capt %></td> 
    <td><%= report.body %></td> 
    <td><%= link_to 'Show', report %></td> 
    <td><%= link_to 'Edit', edit_report_path(report) %></td> 
    <td><%= link_to 'Destroy', report, :confirm => 'Are you sure?', :method => :delete %></td> 
    </tr> 
<% end %> 

보고서를 만든 사용자의 이름을 표시하고 싶습니다. 나는 belongs_to 및 has_many 연관을 선언하면 report.user.name 또는 이와 비슷한 것을 작성함으로써이를 가능하게 할 것이라는 가정하에있었습니다. 내가 어디로 잘못 갔니?

+0

확인, 문제는 내가 사용자 ID를 가지고 있지 않은 내 테이블에 하나 tupple했다이었다. 그래서 이름 메서드를 찾기 위해 끊었습니다. 나는 엉덩이에요. –

답변

3

: 같은

@reports = Report.select("reports.id as id, reports.apparatus as apparatus, reports.capt as capt, reports.body as body, users.name as user_name").joins("LEFT JOIN `users` ON `users`.`id` = `reports`.`user_id`") 

그런 다음 출력이 보일 것이다

이 쿼리는 같은 것을 보일 수 있습니다 관련 사용자. 다음 report.user이 전무를 반환하는 보고서에 USER_ID 필드에 값이없는 경우

<%= report.user.name rescue "none" %> 

을보십시오. 따라서 report.user.namenil.name을 호출하는 것과 같으므로 오류가 발생합니다.

UPDATE : 여기에 더 나은 방법 :

<%= report.user.try(:name) %> 
+0

네, 정확히 그랬습니다. –

1

당신은 할 수 있습니다 :

<%= report.user.name %> 

그러나 효율성을 위해, 컨트롤러에 당신이이 @reports를 가져 오는 데 사용되는 동일한 쿼리에서 사용자 이름을 얻기 위해 가입 할 수 있습니다. 내가 보고서 중 하나 이상이이 없기 때문에 그것의 99 % 확신

<%= report.user_name %> 
+0

<% = report.user.name %>이 (가) 작동하지 않았습니다. "정의되지 않은 메소드 'name'" –

+0

을 제공합니다. 문제는 사용자 ID가없는 테이블에 하나의 tupple이 있다는 것입니다. 그래서 이름 메서드를 찾기 위해 끊었습니다. 나는 엉덩이에요. –

+0

나는 조금 늦었지만 기뻤다. –

관련 문제