我有两个模型,用户模型和凭证。
用户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'
请帮助我,谢谢!
答案 0 :(得分:0)
您已经在User模型中定义了subtotal
方法,因此您应该调用user.subtotal
,但是price
和quantity
是在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(:+) %>