这一定是一个共同的需求,但我似乎无法找到最明确的回答方式。我需要创建一个相当复杂的算法来动态计算rails 4.1 app中的课程成绩。
具体来说,我有一个模型,"课程",每当视图中显示一个实例时,我想动态计算当前等级(十进制值,从许多课程计算.field值)并使用开关/案例将其显示为字母值。我的假设是我可以在控制器中执行此操作(但它似乎很复杂,足以保证它自己的模块?在C ++中我会创建一个类)。同时,由于它是动态创建的,在模型中为它创建一个current_grade字段似乎是不好的形式,所以它不能作为允许的参数之一来回传递(我是知道 - 可以传递一个未在数据库中表示的参数中的变量吗?)。
在我最初的研究中,我看到了hidden_field_tags和helper_methods以及all_helpers和模块以及全局模块等的建议。在时间压力下,我害怕从错误的道路开始。哪种方法更好?还是一个很好的高级文档供参考?
作为一个例子,这里有一个视图,我想计算当前等级,将其与所需等级进行比较,并相应地显示。
# index.html.erb
<% @courses.each do |course| %>
<li>
<%= my_algorithm_to_calculate_curr_grade(many course.fields used to caluculate)
<= course.desired_grade ? "set li to <Color: red>" : "set li to <Color: green>" %>
<%= course.course_name %>
Current Calculation: <%= display_results_of_previous_calculation %>
(Goal: <%= course.desired_grade %>)
<%= link_to 'Show', course %>
<%= link_to 'Edit', edit_course_path(course) %>
<%= link_to 'Drop Course Without Penalty', course, method: :delete, data: { confirm: 'Are you sure?' } %>
</li>
<% end %>
答案 0 :(得分:1)
如果course.fields
是课程或不同模型的属性,则很难从您的问题中判断出来。如果所有字段都是课程属性,我会把它作为课程的实例方法。
class Course < ActiveRecord::Base
def calculated_grade
# fun algorithm
end
end
如果需要从数据库加载course.fields,我可能会使用普通的旧Ruby对象(PORO),也许称之为CourseGradeCalculator(把它放在app / models中,为什么不呢?它&#39 ; s业务逻辑)
class CourseGradeCalculator
attr_reader :course, :fields, :grade
def initialize(course, fields)
@course = course
@fields = fields
@grade = calculate_grade
end
private
def calculate_grade
# fun algorithm
end
end
# controller
@course = Course.preload(:fields).find(params[:id]
# view
CourseGradeCalculator.new(@course, @course.fields)