【问题标题】:Ruby on Rails - Simple calculations shown in the view and stored in databaseRuby on Rails - 在视图中显示并存储在数据库中的简单计算
【发布时间】:2012-07-30 16:30:03
【问题描述】:

首先对这个简单的问题感到抱歉,在花了很多时间之后我放弃了在没有任何帮助的情况下找到它:(。

简化我有以下情况:一个表rates 与列rateconverted 在ruby 中使用脚手架语句生成。 rate 列将显示在视图中,但 converted 列不会显示在应用程序的后台。

现在我的目标是询问用户在字段rate 中给出的费率,以便应用程序可以计算converted 并将此值存储在数据库中。这是一个简单的计算:converted = 1 / rate。

请指教:)。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    嗯,有很多方法可以做到这一点,包括但不限于将逻辑放入模型(可能是最干净的)、控制器和带有隐藏字段和 javascript 的视图本身中。

    我会在模型级别通过回调来实现。例如,将其添加到您的 rates.rb 模型中:

    before_save :calculate_converted_rate
    
    private
    
    def calculate_converted_rate
      self.converted = 1.0 / self.rate
    end
    

    在每次保存 Rates 实例之前,代码可能会建议将转换后的字段设置为 rate 字段的倒数。

    有关 ActiveRecord 回调的更多信息:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

    【讨论】:

      【解决方案2】:

      在您的模型中定义您自己的 mutator 方法。这将允许您从用户那里获取输入,用它做您想做的事情,然后将其存储在数据库中。举例说明:

      class Rate < ActiveRecord::Base
      
          def rate=(value)
              write_attribute :rate, value
              write_attribute :converted, 1.0 / value
          end
      
      end
      

      这将覆盖 Rails 的默认 rate= 方法,当您的模型从(假设)您的表单传递您的 rate 数据时,会调用该方法。使用&lt;%= f.text_field :rate %&gt; 或您需要执行的任何操作,正常构建模型的表单。

      注意1.0 / value,而不是1 / value - 这将确保该表达式的结果是一个浮点数,并且您不会丢失任何精度。如果你在 Ruby 中用一个整数除以一个整数,你总是会得到一个整数。

      【讨论】:

      • 非常感谢,当应用程序需要更多计算时,我会尝试此解决方案。
      • +1 我喜欢这个解决方案 10 倍以上,值总是更新,回调会在实例中留下错误的数据
      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多