Rails关联模型中的User ID,为什么调用不到User的信息?

Rails User ID in an associated model, why can't I call the User's information?

我有一个会议 table,其中有一个 requester_id 和 requestee_id,它们都是用户 ID(使用设计)。

create_table "meetings", force: :cascade do |t|
 t.integer  "requestor_id"
 t.integer  "requestee_id"
 t.datetime "meeting_time"
 t.boolean  "accepted"
 t.datetime "created_at",   null: false
 t.datetime "updated_at",   null: false
end

调用requestor_id.first_name时:

查看

<tbody>
 <% @meetings.each do |meeting| %>
  <tr>
    <td><%= meeting.requestor_id %></td>
    <td><%= @requestor.first_name %></td>
    <td><%= meeting.requestee_id %></td>
    <td><%= meeting.meeting_time %></td>
    <td><%= meeting.accepted %></td>
    <td><%= link_to 'Show', meeting %></td>
    <td><%= link_to 'Edit', edit_meeting_path(meeting) %></td>
    <td><%= link_to 'Destroy', meeting, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
 <% end %>
</tbody>

控制器

 def show
  @requestor = User.find(params[:requestor_id])
 end

它说 nil:NilClass

的未定义方法“first_name”

我不确定这是否有任何相关性,但是当我搜索路线时,none 的会议出于某种原因有一个路径。它只是说:

PUT    /languages_users/:id(.:format)               languages_users#update
DELETE /languages_users/:id(.:format)               languages_users#destroy
GET    /meetings(.:format)                          meetings#index
POST   /meetings(.:format)                          meetings#create
GET    /meetings/new(.:format)                      meetings#new
GET    /meetings/:id/edit(.:format)                 meetings#edit
GET    /meetings/:id(.:format)                      meetings#show
PATCH  /meetings/:id(.:format)                      meetings#update
PUT    /meetings/:id(.:format)                      meetings#update
DELETE /meetings/:id(.:format)                      meetings#destroy

我的一些 config/routes.rb

  Rails.application.routes.draw do
   resources :meetings
   resources :meetings

   devise_for :users

   root 'welcome#index'
  end

app/model/meetings.rb

  class Meeting < ActiveRecord::Base
   has_many :users
  end

如何使用 requestor_id 和 requestee_id 中的整数调用用户 table。另外,从概念上讲,我在这里遗漏或不理解什么?

提前致谢!

尝试预先加载?

@meeting = Meeting.find(params[:id]).includes(:requestor)

@requestor = @meeting.requestor

我注意到您提供的代码有一些改进的机会。

首先,您似乎 resources :meetings 在您的路由文件中列出了两次。这可能是您在 Stack Overflow 问题中的 copy-paste 错误,或者,如果这是实际代码,这可能就是您说 "none of the meetings have a path for some reason."

的原因

独立于此,让我们看看您的 rake: routes 的子集,特别是您的 meetings#show 路线:

GET    /meetings/:id(.:format)                      meetings#show

通过这条足智多谋的路线,您会 params[:id] 发送到您的控制器,在本例中,是会议 ID。

现在,有一件让我感到困惑。在您的视图代码中,您引用了 @meetings,让我认为这是 index 视图,而不是 show 视图,其中我希望看到一个名为 @meeting 的变量。我现在要继续讨论你的表演动作。不过,最后我会回到你的索引视图。

在您的显示控制器操作中,您有以下行:

@requestor = User.find(params[:requestor_id])

但是,您的路由未向参数哈希提供 requestor_id,这意味着您正在调用 User.find(nil)。使用编写的 Controller 代码,我希望您在点击 show.

时会遇到以下错误:ActiveRecord::RecordNotFound: Couldn't find User with 'id'= 或类似内容

您要做的是找到您的会议,并根据找到的会议获取请求者。

所以你可以在你的控制器中做这样的事情:

app/controllers/meetings_controller.rb

def show
  @meeting = Meeting.find(params[:id])
  @requestor = User.find(@meeting.requestor_id)
end

...此时我希望您的视图能够正确呈现。但是,还有更多 Rails-y 方法可以执行此操作,这会将我带到您的会议模型。以下是我要定义的关系:

class Meeting < ActiveRecord::Base
  belongs_to :requestor, class_name: "User"
  belongs_to :requested, class_name: "User"
end

来自 the Rails Guide for the belongs_to association:

4.1.2.2 :class_name

If the name of the other model cannot be derived from the association name, you can use the :class_name option to supply the model name.

除非你的用户模型有一个标题为 meeting_id 的列,否则我怀疑你的 Meeting.users 关联没有连接起来做任何事情。

即使您实际上没有 table 称为 Requestor,我在上面写的关联仍然有效。相反,您指定请求者和被请求者都是特殊类型的用户。这样,您根本不需要在 Controller 中定义 @requestor,而是让您使用...

app/controllers/meetings_controller.rb

def show
  @meeting = Meeting.find(params[:id])
end

def index
  @meetings = Meeting.all
end

...在您的索引视图中(我告诉过您我会回来查看它)...

app/views/meetings/index.html.erb

 <% @meetings.each do |meeting| %>
  <tr>
    <td><%= meeting.requestor.first_name %></td>
    <td><%= meeting.requestee.first_name %></td>
    <td><%= meeting.meeting_time %></td>
    <td><%= meeting.accepted %></td>
    <td><%= link_to 'Show', meeting %></td>

...等等...

让我知道这是否有意义!