连接购物车"总价格"属于付款配置

时间:2016-04-18 04:39:20

标签: ruby-on-rails ruby payment-gateway shopping-cart product

我开始整理一个包含产品,购物车和付款的应用程序。首先,您可以转到/ products将产品添加到购物车。然后,如果您导航到/ cart,系统将填充准备结帐的产品列表。该计划将链接"总价格"将购物车表中的属性纳入付款表。

如何从单独的表中链接两个属性以使它们相同?我已经标记了两个需要相同的属性,"总价格"和"金额。"

create_payments.rb

class CreateOrderItems < ActiveRecord::Migration
def change
  create_table :order_items do |t|
    t.references :product, index: true, foreign_key: true
    t.references :order, index: true, foreign_key: true
    t.decimal :unit_price, precision: 12, scale: 3
    t.integer :quantity
    ***t.decimal :total_price, precision: 12, scale: 3***

    t.timestamps null: false
    end
  end
end

create_order_items.rb

events

如果有任何其他文件需要帮助解决问题,请告诉我们。提前感谢您提供任何类型的帮助!

1 个答案:

答案 0 :(得分:0)

我认为你在这里寻找的是编写一个自定义的“getter”方法,即一个虚拟属性。您也可以覆盖save或使用(activerecord回调)[http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html]

例如:

class Payment < ActiveRecord::Base
  has_many :order_items

  # --------
  # option 1
  # --------

  def amount
    # sums up the total price of the associated order items
    self.order_items.pluck(:price).sum
  end

  # --------
  # option 2
  # --------

  def save(*args)
    self.amount = self.order_items.pluck(:price).sum
    super(*args)
  end

  # ----------
  # option 3
  # ----------

  before_save :set_amount
  def set_amount
    self.amount = self.order_items.pluck(:price).sum
  end

end

使用第一个选项(“自定义getter”),聚合列不会存储在数据库中,并且每次访问它时都会动态重新计算。

使用第二个选项(“覆盖保存”),只要在记录上调用amount,就会自动设置save列。

在我看来,第三种选择可能是最好的。它基本上与选项2相同,但看起来更清洁。