1

私は少し初心者のプログラマーなので、質問が十分に明確でない場合はお詫びします。

使用量(月、使用量)、価格(月、価格)、支出(月、支出)の3つの異なるテーブルがある基本的なRailsアプリを作成しようとしています。支出=usages.usage*prices.priceになるように取得しようとしています。次のコードをSpendモデルに追加しました。

class Spend < ActiveRecord::Base
  c = Usage.all.count
      i = 1
      while i <= c
          u = Usage.find(i)
          p = Price.find(i)
          Spend.create(month:u.month, spend:u.usage*p.price)
          i += 1
      end
end

これは最初はうまく機能しますが、使用量と価格の追加と削除を開始するとすぐにIDが変更されるため、明確ではありません。どうすればもっと良い方法でこれを行うことができますか?

ありがとう、

Kev

4

2 に答える 2

2

この場合、Spendデータベースに既に存在するデータを計算するだけなので、別のモデルを作成することは避けます。厳しいキャッシング要件がない限り (そして、あなたの場合はそうではないと思います)、単純なインスタンス メソッドを使用して、必要なデータを取得できます。

最初に、Usage モデルと Price モデルがどのように関連しているかを把握します。それらをIDで関連付けているように見えるので、1対1の関係のようです(これについて間違っている場合は修正してください)。ただし、それらが同じ主キーを持っていると仮定して関連付けることは危険なアプローチです。むしろ、外部キーを使用して一方のモデルが他方を指すようにします。Priceの主キーを保持するモデルを選択しますUsageが、その逆も機能します。次のような移行を使用して列を追加する必要があります。

def change
  add_column :prices, :usage_id, :integer
end

モデルは次のようになります。

class Usage < ActiveRecord::Base
  has_one :price

  def spend
    usage * price.price
  end
end

class Price < ActiveRecord::Base
  belongs_to :usage
end

spendそして、次のように個々のusageアイテムの価値を見つけることができます。

usage = Usage.find(some_id)
puts usage.spend

または、次のように複数の「支出」を取得できます。

Usage.include(:price).each do |usage|
  puts usage.spend
end

月への参照は省略しました。これをどのように使用しているか、または計算に必要かどうかがわからないためですspend

于 2013-01-27T20:06:19.460 に答える
0

Active Recordアソシエーションガイドをご覧ください:http://guides.rubyonrails.org/association_basics.html

于 2013-01-27T19:55:40.707 に答える