Rails: 列出Parent's Show中Parent的所有children

Rails: List all of Parent's children in Parent's Show

在我的 rails 应用程序中,我可以为该客户端创建一个客户端和一个 worker。目前,我能够列出所有已创建的工人。但是,此列表也包括其他客户的工作人员。

如何在客户展示页面中只列出特定客户的所有工作人员?

我感觉这与我的客户端#show 方法有关。

  class ClientsController < ApplicationController
  before_action :set_client, only: [:show, :edit, :update, :destroy]

  # GET /clients
  # GET /clients.json
  def index
    @clients = Client.all
  end

  # GET /clients/1
  # GET /clients/1.json
  def show
    @workers = Worker.all
  end


  # views/clients/show.html.erb
  <ul>
   <% @workers.each do |worker| %>
    <li><%= worker.first_name %> <%= worker.client.business_name %></li>
   <% end %>
  </ul>

提前致谢。

在您的 ClientsController 中,您的 show 操作应该显示 Client,但您的代码是从 Worker 获取的。你想要更多这样的东西:

def show
  @client = Client.includes(:workers).find(params[:id])
end

# app/views/clients/show.html.erb
<% @client.workers.each do |worker| %>
  <%= worker.name %>
<% end %>

注意:您似乎还有一个 set_client 方法,它正在检索当前 Client 并设置 @client 实例变量。这是一种反模式;在许多情况下,您会检索不需要的数据,并使您的操作更难一目了然。少量的非逻辑重复总比混乱的抽象要好!

直接回答你的问题:

def show
  @client  = Client.find params[:id]
  @workers = @client.workers
end

假设您正在使用足智多谋的路由,params 散列将包括 URL 路径的 id 部分,这里是 /clients/:id。因此,您可以使用它来找到有问题的特定客户,然后为该客户获取作品。

但是您可能想在此处阅读有关此主题的大量详细信息: http://guides.rubyonrails.org/routing.html#nested-resources

首先,您应该定义客户与工作人员之间的 has_many 关系。

class User < ApplicationRecord
  has_many :workers
end

class Worker < ApplicationRecord
  belongs_to :user
end

更多信息:Active Record has_many association

然后在 'show' 操作中,您应该获得与特定用户相关的工作人员。例如:

# GET /clients/1
# GET /clients/1.json
def show
  user = User.find(params[:id]) # find specific user
  @workers = user.workers # get workers related to this user

  # or you can do something like this
  @workers = Worker.where(user_id: params[:id])
end