用于编辑数据对象的Rails实例方法

时间:2017-02-08 13:29:05

标签: ruby-on-rails activerecord

我正在尝试使用一些规则压缩大型数据集,然后返回对象。

我在模型中所做的是:

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

也许一些更开明的铁路大师可以帮助我:)。

3 个答案:

答案 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是指什么?