在模型中执行值更改作为默认值

时间:2015-12-11 06:49:08

标签: ruby-on-rails ruby json activerecord

在控制器呈现为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在这一点上是不可能的,因为我的项目已接近完成,并且尝试返回并更改/重新实现所有内容将花费很长时间。

2 个答案:

答案 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的金额?适用哪条规则?确切的说。

轮到你根据自己的需要调整案例陈述。小心