2016-08-13 6 views
0

私はmysqlデータベースにクエリを行い、結合によって作成されたオブジェクトの配列を返します。私が理解しているところから、ActiveRecordのselectコマンドは新しいオブジェクトの配列を返します。それぞれのオブジェクトには、両方のテーブルのプロパティが結合されています。RailsのActiveRecordオブジェクトにプロパティ/ method_missingアプローチを追加するには?

私はこれらのオブジェクトのそれぞれについていくつかの計算を実行し、いくつかの属性をオブジェクトに関連づけたいと思います。私はこれが私のクラスであれば、hereのようにmethod_missingアプローチを使うことができると私は理解しています。しかし、このオブジェクトはselectコマンドによって作成されるため、私はadd_attrs関数を定義できるクラスコードを持っていません。これは可能ですか?正しい方法でmethod_missingを使用していれば、どうすれば実装できますか?

ここには、ActiveRecordオブジェクトの配列を返す最初のクエリがあります。私はルビーコンソールにアクセスし、コマンド

advertisements = Advertisement.joins(:locations).select_with_location 
puts advertisements[0].inspect 

私のようなものを取得する必要を入力した場合

def self.select_with_location 
    select("advertisements.id, advertisements.weight, locations.latitude, locations.longitude") 
end 

:今

{id: 0, weight: 5, locations.latitude: 49.03030, locations.longitude: 50.5050}

を、私が欲しいのは反復することです広告を介して、各重みについての計算を実行する。その計算の結果を広告の新しい属性に保存したいと思います。weight_multiplierに電話します。私はルビーコンソールにアクセスし、次のコマンドを入力した場合、この計算した後、:

puts advertisements[0].inspect

を、私はこの例では、数字自体は重要ではありません

{id:0, weight: 5, locations.latitude: 49.03030, locations.longitude: 50.5050, weight_multiplier: 0.446003} 

結果を取得したいです、私は、配列内の各広告にweight_multiplier属性を追加したいだけです。

私は、次のコードが間違っている知っているが、これは関数が何をするかの要旨です:

def self.assign_weight_multiplier advertisements 
    totalWeights = advertisements.inject(0){|sum,advertisement| sum + advertisement.weight } 
    advertisements.each do |advertisement| 
     advertisement.weight_multiplier = (Float(advertisement.weight)/Float(totalWeights)) 
    end 
    advertisements 
end 
+1

のインスタンスメソッドとしてweight_multiplierを呼び出すことができます。「コード嘔吐」が存在しないことに感謝しますが、 - ちょっと、ちょっとここでもっと具体的にお尋ねします。あなたはあなたの結果の最小要点/ここで何をしようとしていますか?たぶん、Railsのコンソールプロンプトが適切かもしれません。 –

+0

最小限のコードが追加されました。私が達成しようとしていることが少しはっきりしていることを祈っています! –

+0

私はまだそれを取得しないことを恐れています。あなたは言い換えることができ、Railsコンソールであなたのプロセスを取り上げることができますか?あなたは、「いくつかの物件を関連付ける」ことができます。 –

答えて

1

あなたは

def total_weight 
    @total_weight ||= Advertisement.sum(:weight) 
end 

def weight_multiplier 
    self.weight.to_f/total_weight 
end 

、あなたのAdvertisementクラスに2つの新しいメソッドを追加することができますAdvertisementインスタンス

+0

はい!それは私が必要としていたものです。ありがとう! –

関連する問題