【发布时间】:2017-03-08 05:59:06
【问题描述】:
我有一个表 Materials,has_one 与 MaterialCosts 相关,has_one 与 MaterialCharges 相关。它们都属于材料,在材料中删除或记录时应dependent: :destroy。
我不确定如何构建 Material 类。必须使用来自每个 Material 实例的两个属性来计算 MaterialCosts 和 MaterialCharges 中的字段。它们是cost_per_sqm 和ink_per_sqm。 factor 是 Material 中的一个字段,也用于 MaterialCharges。为了将实例变量用于创建方法,我是否需要在 Material 中初始化它们?还是只需要attr_accessor?
我知道代码需要重构,但当我尝试播种数据时也出现此错误:
NoMethodError: undefined method `[]' for nil:NilClass on line 26 seeds.rb
第 26 行种子.rb:
Material.create({
product_name: "Novajet Art 255gsm", guk_name: "none", roll_width_in: 44, roll_length_m: 30, factor: 7, rounded_sale_price: 71, list_price: 240.00, cost_per_sqm: 7.16, ink_per_sqm: 3, supplier_discount: 0, sell_per_sqm: 71.11
})
这是我的代码:
class Material < ApplicationRecord
has_and_belongs_to_many :job_entries
has_one :material_cost, dependent: :destroy
has_one :material_charge, dependent: :destroy
attr_accessor :cost_per_sqm, :ink_per_sqm, :factor
def initialize(options)
@cost_per_sqm = options['cost_per_sqm'].to_f
@ink_per_sqm = options['ink_per_sqm'].to_f
@factor = options['@factor'].to_f
@total_cost = @cost_per_sqm * @ink_per_sqm
end
after_create :set_material_cost, :set_material_charge
A4_FACTOR = 0.0626514876
A3_FACTOR = 0.124548139
A2_FACTOR = 0.249096276
A1_FACTOR = 0.499702226
B0_FACTOR = 1.41585523
B1_FACTOR = 0.706656651
B2_FACTOR = 0.353328326
B3_FACTOR = 0.176664163
B4_FACTOR = 0.0878836952
private
def set_material_cost
@material_cost = self.create_material_cost(
cost_a4: @total_cost * A4_FACTOR,
cost_a3: @total_cost * A3_FACTOR,
cost_a2: @total_cost * A2_FACTOR,
cost_a1: @total_cost * A1_FACTOR,
cost_b0: @total_cost * B0_FACTOR,
cost_b1: @total_cost * B1_FACTOR,
cost_b2: @total_cost * B2_FACTOR,
cost_b3: @total_cost * B3_FACTOR,
cost_b4: @total_cost * B4_FACTOR
)
end
def set_material_charge
@material_charge = self.create_material_charge(
sell_a4: @total_cost * A4_FACTOR * @factor,
sell_a3: @total_cost * A3_FACTOR * @factor,
sell_a2: @total_cost * A2_FACTOR * @factor,
sell_a1: @total_cost * A1_FACTOR * @factor,
sell_b0: @total_cost * B0_FACTOR * @factor,
sell_b1: @total_cost * B1_FACTOR * @factor,
sell_b2: @total_cost * B2_FACTOR * @factor,
sell_b3: @total_cost * B3_FACTOR * @factor,
sell_b4: @total_cost * B4_FACTOR * @factor
)
end
end
class MaterialCost < ApplicationRecord
belongs_to :material
end
class MaterialCharge < ApplicationRecord
belongs_to :material
end
代码应该是这样的吗?
【问题讨论】:
-
不要覆盖初始化函数
标签: ruby-on-rails ruby