Ruby on rails Rails:列出所有父项';父母中的子女';s秀

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

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

如何在客户端显示页面中仅列出特定客户端的所有工作人员

我觉得这与我的客户的表演方式有关

  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的书。我喜欢这段代码。这很容易理解。谢谢。我喜欢这个代码。这很容易理解。谢谢。我喜欢第二种选择。看起来我可以在一行代码中完成所有事情。令人惊叹的!我喜欢第二种选择。看起来我可以在一行代码中完成所有事情。令人惊叹的!