2

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

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

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

请指教 :)。

4

2 回答 2

3

有很多方法可以做到这一点,包括但不限于将逻辑放入模型中(可能是最干净的)、控制器中以及带有隐藏字段和 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

于 2012-07-30T08:30:03.937 回答
2

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

class Rate < ActiveRecord::Base

    def rate=(value)
        write_attribute :rate, value
        write_attribute :converted, 1.0 / value
    end

end

这将覆盖 Rails 的默认rate=方法,当您的模型rate从(假设)您的表单传递数据时调用该方法。<%= f.text_field :rate %>使用 a或您需要做的任何事情来正常构建模型的形式。

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

于 2012-07-30T08:28:47.053 回答