Ruby 将对象传递给另一个类

Ruby 将对象传递给另一个类,ruby,object,reference,Ruby,Object,Reference,使用时钟系统,我定期从数据库中提取对象,并将它们传递给Sidekiq工作人员进行处理。如果我在将对象传递给Sidekiq worker之前检查它们,我会看到它们拥有的所有字段。但是,在我通过它之后检查该对象,我假设它是对该对象的引用 发条功能 every(30.seconds, 'check_modems.job'){ modem_list = Modem.all modem_list.each do |modem| TestWorker.perform_async(mode

使用时钟系统,我定期从数据库中提取对象,并将它们传递给Sidekiq工作人员进行处理。如果我在将对象传递给Sidekiq worker之前检查它们,我会看到它们拥有的所有字段。但是,在我通过它之后检查该对象,我假设它是对该对象的引用

发条功能

every(30.seconds, 'check_modems.job'){

  modem_list = Modem.all

  modem_list.each do |modem|
    TestWorker.perform_async(modem)
    puts(modem.inspect)
  end
}
上述装置的输出:

<Object id: 1, value: "15", ipaddress: nil>
以及输出:

#<Object:0x00563977f06f48>"
#”

根据我所能找到的,Ruby是按值传递的,本例中的值是一个引用,但我如何从这里返回并获得我需要的对象?

如果只传递简单标识符(例如易于序列化的数字或字符串),而不是复杂的对象,那么代码将更加健壮

将您的
时钟系统
功能更改如下:

modem_ids = Modem.pluck(:id)
modem_ids.each { |id| TestWorker.perform_async(id) }
以及您的员工:

def perform(modem_id)
  modem = Modem.find_by(id: modem_id)
  if modem
    # ...
  end
end

如果只传递简单标识符(例如易于序列化的数字或字符串)而不是复杂对象,那么代码将更加健壮

将您的
时钟系统
功能更改如下:

modem_ids = Modem.pluck(:id)
modem_ids.each { |id| TestWorker.perform_async(id) }
以及您的员工:

def perform(modem_id)
  modem = Modem.find_by(id: modem_id)
  if modem
    # ...
  end
end

更具体地说,您必须这样做的原因是,对于要放入Sidekiq队列然后由Sidekiq worker处理的东西,某些东西会被序列化并作为JSON字符串存储在Redis中。请看——这是Sidekiq的东西,而不是一般的Ruby东西。更具体地说,您必须这样做的原因是这是因为对于要放入Sidekiq队列然后由Sidekiq工作程序处理的内容,这些内容会被序列化并作为JSON字符串存储在Redis中。