0

私はまったく新しい Rails 開発者なので、ご容赦ください :-)

レールに Product と ProductPrice という名前の 2 つのモデルがあります。

ProductPrices は次のようになります。

class CreateProductPrices < ActiveRecord::Migration
  def change
    create_table :product_prices do |t|
      t.integer :product_id
      t.date :since
      t.decimal :price
      t.boolean :current

      t.timestamps
    end
  end
end

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

class ProductPrice < ActiveRecord::Base
  belongs_to :product
  attr_accessible :current, :price, :product_id, :since
end

ここで、製品を通じて価格にアクセスできるようにしたいと考えています。常に現在の価格を表示する必要があります (現在の価格/製品は 1 つだけです。ユーザーは製品を通じて価格を編集できる必要があります。製品の更新で価格が変更された場合は、新しい ProductPrice を挿入する必要があります)。 current = true and since = the current date. 古い ProductPrice はもはや最新ではありません。

ネストされた属性に関する記事を既に見つけましたが、それが進むべき道だと思います。これを行うにはどうすればよいか、誰か教えてもらえますか?

編集:返信ありがとうございます。あなたが言ったように実装してみました。今はproduct.rbにあります:

class Product < ActiveRecord::Base
  belongs_to :menu_category
  belongs_to :menu
  has_many :product_prices, :dependent => :delete_all

  scope :latest_price, lambda {product_prices.where("since <= ?",DateTime.now).order(:since).last}
  attr_accessible :active, :descFR, :descNL, :image, :menu_category_id, :menu_id, :nameFR, :nameNL
  mount_uploader :image, ImageUploader    
end

そして、私が持っている製品のインデックスページには:

<tbody>
  <% @products.each do |product| %>
  <tr>
        <td><%= product.nameNL %></td>
        <td><%= product.nameFR %></td>
        <td><%= product.descNL %></td>
        <td><%= product.descFR %></td>
        <td><%= product.latest_price.price.to_s %></td>

私も試しました: product.latest_price.price または product.latest_price また、latest_price を attr_accessible に追加しようとしました

しかし、私はいつもこのエラーを受け取ります:

undefined method `latest_price' for #<Product:0x49e1e48>

EDIT2:動作するようになりました。これを追加すると、次のこともわかりました。

  def latest_price=(val)
    pp = ProductPrice.where(:product_id => self.id, :since => DateTime.now.to_date).first_or_create(:price => val)
    pp.price = val
    pp.save
  end

次に、質問で私が求めたことを完全に実行します。

4

1 に答える 1

0

Product モデルがあるとします。モデルに次のものが含まれていることを確認してください。

class Product < ActiveRecord::Base
  has_many :product_prices

  def latest_price
    product_prices.where("since <= ?",DateTime.now).order(:since).last
  end
end

すべての価格にアクセスできるようになりました:

@product.find(123)
@product.product_prices.each do |price|
  # each price for the product found here
end

しかし、最新の価格にアクセスするために、メソッドは次のことを提供します。

@product.latest_price.price # latest price
@product.latest_price.since # when the latest price was active since

を追加したことに注意してくださいwhere("since <= ?",DateTime.now)。これにより、事前に価格をスケジュールできます (それ以降の場合)。

商品に新しい価格を追加するには:

@new_price = ProductPrice.create(:price => ?,
                                 :product_id => @product.id,
                                 :since => DateTime.now)

製品に価格を追加する別の方法:

@new_price = ProductPrice.create(:price => ?, :since => DateTime.now)
@product.product_prices.push(@newprice)
@product.save

または:

@product.product_prices << @newprice # this autosaves
于 2012-08-19T22:29:13.970 に答える