我正在尝试使用一些规则压缩大型数据集,然后返回对象。
我在模型中所做的是:
final Path p = Paths.get(path, "lib", "ling", PrefManager.getPref("lingua"));
System.out.println(p);
所以也许我误解了但是调用Network.all.condense不起作用。
class Network < ActiveRecord::Base
def condense
self.each do |row|
#Maybe delete row
end
return self
end
end
也许一些更开明的铁路大师可以帮助我:)。
答案 0 :(得分:1)
您已经定义了一个实例方法,而您想要的是Network
的单例方法:
def self.condense
# now `self` here is a `Network` class itself
all.each do |row| # iterate over each instance of the class
end
end
用法:
Network.condense
P.S。请注意,使用all.each
是非常昂贵的操作,因为它会在处理之前将所有内容加载到内存中 - 可能有一种方法可以使用数据库层来执行您正在执行的操作吗?
答案 1 :(得分:0)
您可以创建一个类,其中包含您想要Networks
condense
数组
class NetworkCondenser
def initialize(networks)
@networks = networks
end
def call
@networks.each do |network|
# do your stuff here
end
@networks
end
end
从控制器或控制台或其他任何方式使用它。
networks = Network.take(100)
condensed_networks = NetworkCondenser.new(networks).call
修改强>
还有另一种方法,那就是在活动记录数组中的每个项目上调用方法condense
。
class Network < ApplicationRecord
def condense
# do your stuff here on a single instance only
# e.g. name = name.upcase if something
end
end
然后从控制台或控制器调用该方法在数组中的每个实例上。
networks = Network.take(100)
networks.each(&:condense)
哪种解决方案更好取决于品味和您的需求我想,我更希望第一种解决方案适用于更复杂的情况。
答案 2 :(得分:-1)
唯一的问题是你不了解self
。这是一个基本的经验法则:
self
引用该类的当前对象。self
指的是类本身。那么你能告诉我你的代码中的2 self
是指什么?