Ruby on rails Rails:列出所有父项';父母中的子女';s秀
在我的rails应用程序中,我可以为该客户端创建一个客户端和一个worker。目前,我可以列出所有已创建的工作人员。但是,此列表也包括其他客户的工作人员 如何在客户端显示页面中仅列出特定客户端的所有工作人员 我觉得这与我的客户的表演方式有关Ruby on rails Rails:列出所有父项';父母中的子女';s秀,ruby-on-rails,ruby,model-associations,Ruby On Rails,Ruby,Model Associations,在我的rails应用程序中,我可以为该客户端创建一个客户端和一个worker。目前,我可以列出所有已创建的工作人员。但是,此列表也包括其他客户的工作人员 如何在客户端显示页面中仅列出特定客户端的所有工作人员 我觉得这与我的客户的表演方式有关 class ClientsController < ApplicationController before_action :set_client, only: [:show, :edit, :update, :destroy] # GE
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>
class客户端控制器
提前感谢。在您的
客户端控制器中,您的显示操作应该显示客户端
,但您的代码是从工作者
获取的。你想要更像这样的东西:
def show
@client = Client.includes(:workers).find(params[:id])
end
# app/views/clients/show.html.erb
<% @client.workers.each do |worker| %>
<%= worker.name %>
<% end %>
def显示
@client=client.includes(:workers).find(参数[:id])
结束
#app/views/clients/show.html.erb
注意:看起来您还有一个set\u client
方法,该方法正在检索当前client
并设置@client
实例变量。这是一种反模式;在许多情况下,您检索不需要的数据,使您的操作更难一目了然。少量的非逻辑复制比混乱的抽象要好 在客户端控制器中,您的显示操作应该显示客户端,但您的代码是从工作者获取的。你想要更像这样的东西:
def show
@client = Client.includes(:workers).find(params[:id])
end
# app/views/clients/show.html.erb
<% @client.workers.each do |worker| %>
<%= worker.name %>
<% end %>
def显示
@client=client.includes(:workers).find(参数[:id])
结束
#app/views/clients/show.html.erb
注意:看起来您还有一个set\u client
方法,该方法正在检索当前client
并设置@client
实例变量。这是一种反模式;在许多情况下,您检索不需要的数据,使您的操作更难一目了然。少量的非逻辑复制比混乱的抽象要好 要直接回答您的问题:
def show
@client = Client.find params[:id]
@workers = @client.workers
end
假设您使用的是资源路由,params
散列将包括URL路径的id部分,这里的id部分是/clients/:id
。因此,您可以使用它来查找有问题的特定客户机,然后获取该客户机的作品
但是关于这个话题,你可能想在这里读到很多细节:
要直接回答您的问题:
def show
@client = Client.find params[:id]
@workers = @client.workers
end
假设您使用的是资源路由,params
散列将包括URL路径的id部分,这里的id部分是/clients/:id
。因此,您可以使用它来查找有问题的特定客户机,然后获取该客户机的作品
但是关于这个话题,你可能想在这里读到很多细节:
首先,你应该定义客户和员工之间的多种关系
class User < ApplicationRecord
has_many :workers
end
class Worker < ApplicationRecord
belongs_to :user
end
首先,你应该定义客户和员工之间的关系
class User < ApplicationRecord
has_many :workers
end
class Worker < ApplicationRecord
belongs_to :user
end
我想我明白了。在上面的代码中,我首先在实例变量@client中包含与客户机关联的所有worker。然后我打电话给客户的员工,因此所有与该员工相关的属性(即姓名)。Coreyward,我不太明白你的说明。可以保持原样吗?或者我应该更改它吗?使用.includes
快速加载:workers
做得很好。这样做将根据您使用数据库的方式减少数据库查询的数量,从而提高性能。@hp001它将按照您的使用方式正常工作。更重要的是设计和使代码更易于更改。如果你有兴趣了解更多,我强烈推荐桑迪·梅茨的书,我想我明白了。在上面的代码中,我首先在实例变量@client中包含与客户机关联的所有worker。然后我打电话给客户的员工,因此所有与该员工相关的属性(即姓名)。Coreyward,我不太明白你的说明。可以保持原样吗?或者我应该更改它吗?使用.includes
快速加载:workers
做得很好。这样做将根据您使用数据库的方式减少数据库查询的数量,从而提高性能。@hp001它将按照您的使用方式正常工作。更重要的是设计和使代码更易于更改。如果您有兴趣了解更多,我强烈推荐Sandi Metz的书。我喜欢这段代码。这很容易理解。谢谢。我喜欢这个代码。这很容易理解。谢谢。我喜欢第二种选择。看起来我可以在一行代码中完成所有事情。令人惊叹的!我喜欢第二种选择。看起来我可以在一行代码中完成所有事情。令人惊叹的!