Rails:在Parent's Show中列出所有Parent的子项

时间:2016-07-12 15:55:27

标签: ruby-on-rails ruby model-associations

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

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

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

#----------------Cut Here----------------------

import stem
from stem import Signal
from stem.control import Controller
from stem.connection import connect
import time
#
# Create a new controller 
#
controller = Controller.from_port()
Password = "My_Personal_Password"
#
def renew_tor():
    global controller
    global Password
    print ('Renewing Tor Circuit')
    if "stem.control.Controller" not in str(controller):
      #if global controller exist no more
      controller = Controller.from_port()
    # debug output
    print (controller)
    # authenticare the connection with the server control port 
    controller.authenticate(Password)
    print ('Tor running version is : %s' % controller.get_version() )
    # force a new circuit
    controller.signal(Signal.NEWNYM)
    # wait for new circuit
    time.sleep(10)
    print ('New Tor circuit estabilished')

if __name__ == "__main__":
    for i in range (10000):
      print ( " Attempt n. : %i " % i)  
      renew_tor()


#----------------Cut Here(end)--------------------------------------------

提前致谢。

3 个答案:

答案 0 :(得分:3)

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实例变量。这是一种反模式;在许多情况下,您可以检索不需要的数据,并使您的操作一目了然。少量的非逻辑复制比混淆抽象更好!

答案 1 :(得分:0)

直接回答您的问题:

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

假设您正在使用资源丰富的路由,params哈希将包含URL路径的id部分,此处为/clients/:id。因此,您可以使用它来查找有问题的特定客户端,然后获取该客户端的工作。

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

答案 2 :(得分:0)

首先,您应该在客户端和工作人员之间定义一个has_many关系。

class User < ApplicationRecord
  has_many :workers
end

class Worker < ApplicationRecord
  belongs_to :user
end

更多信息:Active Record has_many association

然后在&#39;节目&#39;行动你应该得到与特定用户相关的工人。例如:

# 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