首页 > 解决方案 > 覆盖 setter 属性不调用

问题描述

我创建对象 TriggerFillLocalRunAt。

如果属性 tables_ids 为空,则需要将此属性设置为所有 id。我想覆盖tables_ids 的getter。

class TriggersFillLocalRunAt
  attr_reader :tables_ids
  attr_reader :offset
  attr_reader :timezone
  attr_reader :org
  attr_reader :run_at

  def initialize(org, table_ids, offset, timezone, run_at)
    @org = org
    tables_ids = table_ids
    @offset = offset.to_i
    @timezone = timezone
    @run_at = run_at
  end

  def tables_ids=(value)
    @tables_ids = value ? value.split(' ').map(&:to_i) : tables_ids_for_subdomain
  end

  def perform
.................
end

end

我创建对象TriggersFillLocalRunAt.new(org, table_ids, offset, timezone, run_at).perform

其中 table_ids 为空

我的overide getter 没有调用并且@tables_ids 为空。

标签: ruby-on-railsruby

解决方案


在调用 setter 时,您总是需要显式使用 self :

def initialize(org, table_ids, offset, timezone, run_at)
  @org = org
  self.tables_ids = table_ids
  @offset = offset.to_i
  @timezone = timezone
  @run_at = run_at
end

如果您不使用self,您只需分配局部变量tables_ids。我还建议您使用关键字参数,这样您就不必记住 5 个参数的顺序:

def initialize(org:, table_ids:, offset:, timezone:, run_at:)
  @org = org
  self.tables_ids = table_ids
  @offset = offset.to_i
  @timezone = timezone
  @run_at = run_at
end

推荐阅读