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
在我的 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