Ruby on rails 重写Postgres数组类型移位运算符
是否可以重写该方法在Array类中定义的Ruby on rails 重写Postgres数组类型移位运算符,ruby-on-rails,arrays,ruby,postgresql,ruby-on-rails-4,Ruby On Rails,Arrays,Ruby,Postgresql,Ruby On Rails 4,是否可以重写该方法在Array类中定义的,因此您不能在模型中执行该操作 实现这一点的一种方法是通过混合 module WithShift def << arg # do something end end def hours read_attribute("hours").extend(WithShift) end 带换档的模块 def该方法是在Array类中定义的,因此不能在模型中这样做 实现这一点的一种方法是通过混合 module WithShift
,因此您不能在模型中执行该操作
实现这一点的一种方法是通过混合
module WithShift
def << arg
# do something
end
end
def hours
read_attribute("hours").extend(WithShift)
end
带换档的模块
def该方法是在Array类中定义的,因此不能在模型中这样做
实现这一点的一种方法是通过混合
module WithShift
def << arg
# do something
end
end
def hours
read_attribute("hours").extend(WithShift)
end
带换档的模块
def基于@ismael的答案,在ruby=
中是setter方法名称的一部分
此代码
def小时数=arr
结束
创建一个名为hours=
的方法,而在ruby中,基于@ismael的答案构建的=
是setter方法名称的一部分
此代码
def小时数=arr
结束
创建一个名为hours=
的方法,而每次使用hours属性时包含模块是否会产生性能/内存成本?是的,大约慢15倍。但是可以忽略不计,除非你多次调用这个方法。还要注意,include
不起作用。实际上,您要做的是使用extend
。我已经编辑了我的答案,并添加了一个基准测试。每次使用小时属性时,包括模块是否有性能/内存成本?是的,大约慢15倍。但是可以忽略不计,除非你多次调用这个方法。还要注意,include
不起作用。实际上,您要做的是使用extend
。我已经编辑了我的答案并添加了一个基准
def hours<<(val)
super(# do some stuff before pushing)
end
module WithShift
def << arg
# do something
end
end
def hours
read_attribute("hours").extend(WithShift)
end
require 'benchmark/ips'
module WithShift
def << arg
end
end
def with_extend; [1,2,3].extend(WithShift); end
def base; [1,2,3]; end
Benchmark.ips do |x|
x.report("base") { base }
x.report("with extend") { with_extend }
x.compare!
end
Calculating -------------------------------------
base 5.506M (± 9.1%) i/s - 27.415M in 5.022561s
with extend 349.984k (± 7.6%) i/s - 1.769M in 5.081799s
Comparison:
base: 5505897.2 i/s
with extend: 349984.1 i/s - 15.73x slower