2017-02-08 4 views
0

大規模なデータセットをいくつかのルールで凝縮し、オブジェクトを返そうとしています。データオブジェクトを編集するためのRailsインスタンスメソッド

これは何モデルの内側に私はやった:だから多分私は誤解しているが、Network.all.condenseの呼び出しは動作しません

class Network < ActiveRecord::Base 
    def condense 
    self.each do |row| 
     #Maybe delete row 
    end 
    return self 
    end 
end 

undefined method `condense' for #<Network::ActiveRecord_Relation 

たぶん、いくつかのより多くの啓発レールの第一人者は、私を助けることができます:)

答えて

0

あなたはcondense

class NetworkCondenser 
    def initialize(networks) 
    @networks = networks 
    end 

    def call 
    @networks.each do |network| 
     # do your stuff here 
    end 
    @networks 
    end 
end 

そして、コントローラまたはコンソールまたは何から、このようにそれを使用したいNetworksの配列を取り込んでクラスを作成することができます。

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) 

どのソリューションが味とニーズにより優れているかわかります。私はより複雑な状況では最初の方が良いでしょう。

+1

ああ、ここで我々はそれを持っている!どうもありがとうございます。これはまさに私が探していたものでした –

+0

なぜオブジェクトのアクティブなレコード配列に直接基づいてインスタンスを扱うことができないのか分かりませんが。はるかに良くなり、きれいになるでしょう。この解決法を使用しても、1つのステップから多くのように感じる –

+0

@JonasUlveseth私は可能な解決策で答えを更新しました – Iceman

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 

PS all.eachを使用すると、処理前にすべてをメモリにロードするため、非常に高価な操作であることに注意してください。データベースレイヤーを使用して作業を行う方法があるかもしれません。

+0

私はシングルトンを理解しています。私はそれを試して、それは動作します。しかし、私はオブジェクトがインスタンスにあるwatheverで動作するように柔軟性が必要です。 Network.take(100).condense またはNetwork.where(something: "123")。all.condense –

+0

@JonasUlveseth 'Network。take(100) 'は' Array'のインスタンスを返し、 '未定義メソッド 'を送出します。 –

+0

はい、私はそれが失敗する理由を見ることができます。ちょうどこれがそれを行うきれいな方法だと思うし、周りに道がないことを理解できない。私はオブジェクトをどんな方法にも渡すことができ、それはうまくいくでしょう。しかし、このようなインスタンスで作業するのはうれしいことではありません。 –

-1

唯一の問題は、理解できないことです。self。これは基本的な経験則です:

  • selfselfは、クラスの現在のオブジェクトを参照しています。クラスメソッドにおける
  • selfは、クラス自体を参照します。

コード内の2 selfはどういう意味ですか?

+0

私は自分自身がインスタンス内にあるデータのオブジェクトを指しているとします したがって、Network.newのように、selfには新しいオブジェクトがありますその中に。だから私はこのNetwork.all.condenseのようなメソッドを起動すると、自分自身としてNetwork.allにアクセスできるはずだと思った –

関連する問題