如何获得铁轨小计价格?

时间:2018-10-20 16:17:22

标签: ruby-on-rails-5

我有两个模型,用户模型和凭证。

用户has_many凭证 代金券归属用户

在我的模式中:

create_table "vouchers", force: :cascade do |t|
    t.float "price"
    t.float "quantity"
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_pakets_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "admin", default: false, null: false
    t.string "username"
    t.string "id_number"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

在我的路线上:

  resources :users do
    resources :vouchers
  end

在用户控制器中:

  def index
    @users = User.all
    @vouchers = Voucher.all
  end

在优惠券模型中:

def subtotal
  price * quantity
end

在我的用户索引中:

<% @users.each.with_index(1) do |user| %>
 <%= user.username %>
 <%= user.vouchers.count %>
 <%= user.vouchers.subtotal %> (how to get this subtotal?)
<% end %>

我收到此错误=>“的未定义方法'subtotal'

请帮助我,谢谢!

2 个答案:

答案 0 :(得分:0)

您已经在User模型中定义了subtotal方法,因此您应该调用user.subtotal,但是pricequantity是在Voucher类中定义的,所以我想您真正想做的是在Voucher模型上定义subtotal方法。

然后向用户模型添加另一种方法,该方法求和属于该用户的凭证的所有小计,例如:

def subtotals_sum
  vouchers.sum(&:subtotal)
end

您可以在https://api.rubyonrails.org/v5.2/classes/Enumerable.html#method-i-sum

处查看sum方法的文档

答案 1 :(得分:0)

在用户模型中,您可以定义一个函数以汇总所有凭单小计:

def vouchers_subtotal
  sum = 0
  vouchers.each {|v|
    sum += v.subtotal
  }
  return sum
end

另一种选择是仅对模板文件中的所有值求和:

<%= user.vouchers.collect{|v| v.subtotal}.inject(:+) %>