RoR将对象添加到已初始化的数组中?

时间:2016-11-03 13:49:42

标签: ruby-on-rails arrays ruby

这是我第一次使用Ruby on Rails,所以如果问题很明显我很抱歉,但不幸的是我无法在任何地方找到答案。

class Client < Person

  clientList = []

  def initialize(name, surname, email, wallet)
    super(name, surname, email)
    @wallet = wallet
  end

  attr_reader :wallet, :clientList

  def to_s
    super  + ", #{@wallet}"
  end

  def add_to_array
    clientList + this.object 
    #i know its not correct
  end
end

我想创建方法,它允许我将客户端类的实例添加到clientList数组。之后还有什么其他方法可以在def initialize(name, surname, email, wallet)中使用此方法。像this.add_to_array

这样的东西

我想拥有包含所有客户端的数组,但我不希望每次创建新客户端时都使用方法add_to_array。它应该是自动的。

2 个答案:

答案 0 :(得分:1)

要将客户端实例添加到clientList,您必须将clientList更改为 类实例变量 ,为其添加访问者和致电add_to_array(我将其重命名为add_to_clients_list)以初始化方法,以便每次创建clientList实例时Client都会更新:

class Client < Person

  @clientList = []

  class << self
    attr_accessor :clientList # add an accessor, so you can use Client.clientList
  end

  def initialize(name, surname, email, wallet)
    super(name, surname, email)
    @wallet = wallet
    add_to_array # call a method, that adds this created instance to array
  end

  attr_reader :wallet, :clientList

  def to_s
    super  + ", #{@wallet}"
  end

  def add_to_array
    self.class.clientList << self 
  end
end

现在:

# create instance of Client
Client.new(1,2,3,4)
#<Client:0x007f873db25a68 @wallet=4>
# It is automatically added to `clientList`
Client.clientList
#=> [#<Client:0x007f873db25a68 @wallet=4>]

答案 1 :(得分:0)

你可以试试这个

class Client < Person
  @@clientList = []

  def initialize(name, surname, email, wallet)
    super(name, surname, email)
    @wallet = wallet
    @@clientList << self
  end

  attr_reader :wallet, :clientList

  def to_s
    super  + ", #{@wallet}"
  end
end

但说实话,我建议您重新构建此代码。如果你使用的是rails,那么通过使用具有许多关联的活动记录模型可以更好地处理它。

class ClientList < ActiveRecord::Base
  has_many :clients
end

class Person < ActiveRecord::Base
end

class Client < Person
  belongs_to :client_list
end