我想计算中期测试和最终测试成绩。 E.g:
mid test = 80 , final test = 80
(midtest + finaltest)/2 >=80
grade = "A"
是否可以在视图中执行if条件并插入数据库?类似的东西:
if (midtest + finaltest) / 2 >= 80
grade = "A"
elsif (midtest + finaltest)/2 >= 70 and < 80
grade = "B"
elsif (midtest + finaltest) /2 >= 60 and < 70
grade = "C"
因此,在视图中,我们不需要text_field
等级,因此计算会自动插入到数据库中。
这是解决方案
控制器
def create
@nilai = Nilai.new(params[:nilai])
@nilai.get_grade
respond_to do |format|
if @nilai.save
format.html { redirect_to @nilai, notice: 'Nilai was successfully created.' }
format.json { render json: @nilai, status: :created, location: @nilai }
else
format.html { render action: "new" }
format.json { render json: @nilai.errors, status: :unprocessable_entity }
end
end
end
class Nilai < ActiveRecord::Base
attr_accessible :grade, :id_makul, :id_mhs, :id_nilai, :uas, :uts
def get_grade
@calculate = (self.uas + self.uts)/2
if @calculate >= 80
self.grade = "A"
elsif @calculate >=70 and @calculate < 80
self.grade = "B"
elsif @calculate >=60 and @calculate <70
self.grade = "C"
elsif @calculate >=50 and @calculate <60
self.grade = "D"
else
self.grade = "E"
end
end
end
答案 0 :(得分:3)
仍在猜测你真正想要的是什么以及为什么你认为你必须在视图中做到这一点......
正如我上面所说,视图应仅用于显示已存在数据的代码。将内容插入数据库的代码适用于您的模型和控制器。
我建议:
1)您在模型上创建一个名为“等级”的方法,例如:
def grade
if (midtest + finaltest) / 2 >= 80
return "A"
elsif (midtest + finaltest)/2 >= 70 and < 80
return "B"
elsif (midtest + finaltest) /2 >= 60 and < 70
return "C"
else
return "F"
end
end
现在,您可以从您的视图中调用此方法,例如:
Grade: <%= @my_model.grade %>
请注意,此方法不会将其插入数据库。
或强>
2)您在before_save
回调
例如,假设您将其存储在db:“/ p”中的“grade”列中
class MyModel < ActiveRecord::Base
before_create :calculate_grade
def calculate_grade
if (midtest + finaltest) / 2 >= 80
self.grade = "A"
elsif (midtest + finaltest)/2 >= 70 and < 80
self.grade = "B"
elsif (midtest + finaltest) /2 >= 60 and < 70
self.grade = "C"
else
self.grade = "F"
end
end
end
现在,无论何时保存模型,都会从测试分数中重新计算成绩,并将其保存到数据库中。 所以你可以在你的视图中使用“等级”,但它来自数据库专栏
Grade: <%= @my_model.grade %>
答案 1 :(得分:2)
但是,不是一个好习惯让你的观点有你的逻辑。始终尝试仅显示您的视图。所有处理逻辑都应该在模型中
理念是,Fat模型,瘦控制器视图仅用于演示。因此,在您的情况下,尝试至少看到登录到帮助方法。
我注意到的另一件事是,你可以拥有这一行
(midtest + finaltest) / 2
到
average_marks = (midtest + finaltest) / 2
并在其他地方使用average_marks
,因为它更干(不要重复自己)
HTH :)