在控制器呈现为JSON之前,我需要对Rails模型的数据进行一些基本的值计算。这是商店的API ..产品有一个价格,属于商店。在我们的价格表中,我们有一个名为“金额”(十进制)的列,用于存储产品的成本。
在价格模型上,我要做的是对所述金额进行计算,因为我们需要增加价格保证金。
然后在我的产品控制器中构建查询,但是,永远不会计算金额,而是存储在DB中的成本以JSON格式输出。价格包含在使用包含的产品查询中。目前,rails logger抛出一个错误,上面写着“NoMethodError(未定义的方法`数量'代表#)”。
class API::ProductsController < ApplicationController
before_filter :authenticate_user!
def index
@department = params[:department_id]
@aisle = params[:aisle_id]
if @department.present?
@products = Product.includes(:department).includes(:aisle).where("products.store_id @> '{?}'", params[:id].to_i).includes(:price).where('prices.store_id = ?', params[:id]).references(:prices).limit(params[:max])
end
render json: @products
end
产品型号:
class Product < ActiveRecord::Base
belongs_to :store
belongs_to :department
belongs_to :aisle
has_one :price
def as_json(options)
super(:only => [:id, :name, :description, :image, :weight, :store_id],
:include => {
:price => {:only => [:amount, :store_id]},
:department => {:only =>[:name, :id]},
:aisle => {:only => [:name, :id]}
}
)
end
end
价格模型,我正在尝试根据金额(十进制)进行价格计算:
class Price < ActiveRecord::Base
belongs_to :product
belongs_to :store
case self.amount
when proc {|n| n <= 1}
return self.amount * 0.15
when 115..135
return self.amount * 0.15
when 135..500
return self.amount * 0.15
end
end
Jbuilder / rabl在这一点上是不可能的,因为我的项目已接近完成,并且尝试返回并更改/重新实现所有内容将花费很长时间。
答案 0 :(得分:1)
您的Price类需要使用此方法而不是简单的计算:
def something_amount
case self.amount
when proc {|n| n <= 1}
self.amount * 0.15
when 115..135
self.amount * 0.15
when 135..500
self.amount * 0.15
end
end
然后在您想要查询中更改的金额时调用此方法
答案 1 :(得分:1)
要使用与db中的列相同的方法名称而不创建无限循环,可以引用super
:
def amount
case super
when 0..1
(super + super * 0.15)
when 115..135
(super + super * 0.20)
when 136..500
(super + super * 0.25)
else
(super + super * 0.40)
end
end
请注意,使用此方法,您无法对2..114
范围内的金额进行任何更改。
此外,您的范围如115..135和下一个范围为135..500。它留下了违规行为,因为如何处理135的金额?适用哪条规则?确切的说。
轮到你根据自己的需要调整案例陈述。小心