gpt4 book ai didi

mysql - 从高层 View 看 Rails : performing calculations on a model value between view and controller

转载 作者:行者123 更新时间:2023-11-29 12:16:25 27 4
gpt4 key购买 nike

这一定是一个常见的需求,但我似乎无法以最 ruby 的方式找到明确的答案。我需要创建一个相当复杂的算法来动态计算 Rails 4.1 应用程序中的类(class)成绩。

具体来说,我有一个模型“course”,每当它的实例显示在 View 中时,我想动态计算当前成绩(一个十进制值,根据许多 course.field 值计算得出)并显示它作为使用 switch/case 的字母值。我的假设是我可以在 Controller 中执行此操作(但它似乎足够复杂以保证它自己的模块?在 C++ 中我会创建一个类)。同时,由于它是动态创建的,因此在模型中为其创建 current_grade 字段似乎是一种不好的形式,因此它不是我可以作为允许的参数之一来回传递的参数(据我所知 -可以在参数中传递一个未在数据库中表示的变量吗?)。

在我最初的研究中,我看到了hidden_​​field_tags、helper_methods、all_helpers、模块、全局模块等的建议。在时间压力下,我害怕开始走上错误的道路。哪种方法更好?或者一个好的高级文档供引用?

作为示例,这是一个 View ,我想在其中计算当前成绩,将其与所需成绩进行比较,并相应地显示。

# 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 %>

最佳答案

很难从您的问题中判断 course.fields 是类(class)的属性还是不同模型的属性。如果所有字段都是 Course 属性,我会将其作为 Course 上的实例方法。

class Course < ActiveRecord::Base
def calculated_grade
# fun algorithm
end
end

如果 course.fields 需要从数据库加载,我可能会使用普通的旧 Ruby 对象 (PORO),也许将其称为 CourseGradeCalculator(将其放在应用程序/模型中,为什么不呢?这是业务逻辑)

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)

关于mysql - 从高层 View 看 Rails : performing calculations on a model value between view and controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com