私は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
のインスタンスメソッドとして
weight_multiplier
を呼び出すことができます。「コード嘔吐」が存在しないことに感謝しますが、 - ちょっと、ちょっとここでもっと具体的にお尋ねします。あなたはあなたの結果の最小要点/ここで何をしようとしていますか?たぶん、Railsのコンソールプロンプトが適切かもしれません。 –最小限のコードが追加されました。私が達成しようとしていることが少しはっきりしていることを祈っています! –
私はまだそれを取得しないことを恐れています。あなたは言い換えることができ、Railsコンソールであなたのプロセスを取り上げることができますか?あなたは、「いくつかの物件を関連付ける」ことができます。 –