0

Price、UnitPrice、Purchaseという3つのモデルがあります。PriceモデルとUnitPriceモデルには、amountスコープを設定して両方の合計を取得しようとしているという属性があります。2つのスコープを作成しました。1つは両方のモデルの合計です。もう1つのスコープはdate、両方のモデルのdateフィールドの属性を取得することです。

私はこれをやろうとしています:

<%= number_to_currency(current_user.purchases.today.total)

しかし、エラーが発生します:

NoMethodError in pages#home

undefined method `today' for #<ActiveRecord::Relation:0x77f94c0>

私のコード:

class Purchase < ActiveRecord::Base
  belongs_to :user
  belongs_to :price
  belongs_to :unit_price

  def total
    self.price.sum(:amount) + self.unit_price.sum(:amount)
  end

  def today
    self.price.where(:date => Date.today) && self.unit_price.where(:date=> Date.today)
  end
end

class Price < ActiveRecord::Base
  attr_accessible :amount, :date
  belongs_to :user
  has_many :purchases
end

class UnitPrice < ActiveRecord::Base
  attr_accessible :amount, :date
  belongs_to :user
  has_many :purchases
end

私は何をすべきか?

4

2 に答える 2

2

あなたの問題は、インスタンス メソッドの代わりにクラス メソッドを使用している可能性があると思います。Purchase クラスでself.、メソッド定義の前にあるを削除します。

class Purchase < ActiveRecord::Base
  def total
    self.price.sum(:amount) + self.unit_price.sum(:amount)
  end

  def today
    self.price.where(:date => Date.today) && self.unit_price.where(:date=> Date.today)
  end
end
于 2012-08-13T23:13:01.093 に答える
1

メソッドtotalとメソッドtodayは、モデル オブジェクトで定義されます。呼び出す current_user.purchasesと、関係に関連付けられます。これはhas_many、最終的には配列であることを意味します。したがって、 Purchase メソッドを呼び出すことはできません。次の方法で実行できます。

  class Purchase < ActiveRecord::Base
    # ...
    scope :today, lambda { joins(:unit_price, :price).
                             where(:price => {:date => Date.today}, 
                                   :unit_price => { :date => Date.today }) }
    def total
        self.price.sum(:amount) + self.unit_price.sum(:amount)
    end
  end

そして、次のように呼び出します。

   <%= number_to_currency(current_user.purchases.today.inject{ |sum, p| sum + p.total }) %>

スコープはリレーションで呼び出すことができます。

totalこれも Purchase メソッドであり、リレーションは Array であるため、inject を呼び出す必要があるため、配列を集約する必要があります。コードをきれいに保つために、次のように呼び出すことができるようにtoday_purchases_totalメソッドを定義したい場合があります。User

   <%= number_to_currency(current_user.today_purchases_total) %>

詳細については、 http ://guides.rubyonrails.org/active_record_querying.html#scopes およびすべての RoR ガイド全般を参照してください。

于 2012-08-16T21:10:49.173 に答える