Ruby on rails 使用缺少的方法定义动态setter

Ruby on rails 使用缺少的方法定义动态setter,ruby-on-rails,ruby,Ruby On Rails,Ruby,我希望能够在我的代码中使用以下结构: p obj.graph_XYZ obj.graph_XYZ << obj2 p obj.graph\u XYZ 像这样的东西可能适合你 $irb 甲级 属性存取器:xyz 结束 =>零 新的 => # a、 xyz =>零 a、 xyz[2] 甲级 def方法_缺失(名称,*args) 返回super(name,*args),除非name.to\s=~/^graph/ words=名称到拆分(“uu”) words.shift#摆脱图形_ #现

我希望能够在我的代码中使用以下结构:

p obj.graph_XYZ
obj.graph_XYZ << obj2
p obj.graph\u XYZ

像这样的东西可能适合你

$irb
甲级
属性存取器:xyz
结束
=>零
新的
=> #
a、 xyz
=>零
a、 xyz[2]
甲级
def方法_缺失(名称,*args)
返回super(name,*args),除非name.to\s=~/^graph/
words=名称到拆分(“uu”)
words.shift#摆脱图形_
#现在做你喜欢做的
# ...
如果(实例_变量_get“@#{words.first.downcase}”).nil?
实例变量集“@#{words.first.downcase}”,[]
结束
(实例_变量_get“@#{words.first.downcase}”)
结束
结束
=>零
新的
=> #
a、 图XYZ
=> []
a、 图XYZ[2]
a、 图XYZ
=> [2]

像这样的东西可能适合你

$irb
甲级
属性存取器:xyz
结束
=>零
新的
=> #
a、 xyz
=>零
a、 xyz[2]
甲级
def方法_缺失(名称,*args)
返回super(name,*args),除非name.to\s=~/^graph/
words=名称到拆分(“uu”)
words.shift#摆脱图形_
#现在做你喜欢做的
# ...
如果(实例_变量_get“@#{words.first.downcase}”).nil?
实例变量集“@#{words.first.downcase}”,[]
结束
(实例_变量_get“@#{words.first.downcase}”)
结束
结束
=>零
新的
=> #
a、 图XYZ
=> []
a、 图XYZ[2]
a、 图XYZ
=> [2]

Right,我也尝试在method\u missing中捕获
graph\u XYZ=
,但在使用
时没有调用它。Right,我也尝试在method\u missing中捕获
graph\u XYZ=
,但在使用
时没有调用它,在我的情况下,属性不是在本地设置的,而是使用neo4J上的restapi设置的,我不知道neo4J,但是你要做的一件事就是用数组初始化变量。你可以先调用getter,如果它是nil pass
[],那么在我的例子中,属性不是在本地设置的,而是使用neo4J上的RESTAPI设置的,你知道在这种情况下可以做什么吗?我不知道neo4J,但是你必须管理的一件事是用数组初始化变量。您可以先调用getter,如果是nil pass
[]
$ irb                                                                                      

class A
  attr_accessor :xyz
end
=> nil
a = A.new
=> #<A:0x0000010096bc88>
a.xyz
=> nil
a.xyz << 2
NoMethodError: undefined method `<<' for nil:NilClass
  from (irb):6
  from /Users/iain/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'
a.xyz = [ ]
=> []
a.xyz << 2
=> [2]
a.xyz
=> [2]
class A
  def method_missing( name, *args )
    return super( name, *args ) unless name.to_s =~ /^graph/  
    words = name.to_s.split( "_" )
    words.shift # get rid of graph_

    # now do what you like
    # ...
    if (instance_variable_get "@#{words.first.downcase}").nil?
      instance_variable_set "@#{words.first.downcase}", []
    end

    (instance_variable_get "@#{words.first.downcase}")
  end
end
=> nil
a = A.new
=> #<A:0x00000100844a58>
a.graph_XYZ
=> []
a.graph_XYZ << 2
=> [2]
a.graph_XYZ
=> [2]