Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用Rails中文档中的现有值从mongoid类运行方法?_Ruby On Rails_Mongoid - Fatal编程技术网

Ruby on rails 如何使用Rails中文档中的现有值从mongoid类运行方法?

Ruby on rails 如何使用Rails中文档中的现有值从mongoid类运行方法?,ruby-on-rails,mongoid,Ruby On Rails,Mongoid,我真的找不到关于这个问题的任何东西,而且我也找不到更好的方式来描述这个问题,所以如果这个问题不好,我真的很抱歉 我有一个简单的模型: field :weight, type: Integer field :height, type: Integer 我想实际计算并保存体重指数(这是一个简单的数学公式),在一个新的领域。在我的研究中,我有两个选择,但我不确定这是正确的方法还是我运气好 第一种方法:使用默认值 从rails控制台进行实例化工作: a = Tmodel.new(weight: 70,

我真的找不到关于这个问题的任何东西,而且我也找不到更好的方式来描述这个问题,所以如果这个问题不好,我真的很抱歉

我有一个简单的模型:

field :weight, type: Integer
field :height, type: Integer
我想实际计算并保存体重指数(这是一个简单的数学公式),在一个新的领域。在我的研究中,我有两个选择,但我不确定这是正确的方法还是我运气好

第一种方法:使用默认值 从rails控制台进行实例化工作:

a = Tmodel.new(weight: 70, height: 170)
=> #<Tmodel _id: 535fe9506c75730fe8000000, created_at: nil, updated_at: nil, weight: 70.0, height: 170, bmi: 24.221453287197235>
从控制台:

b = Tmodel.new(weight: 70, height: 170)
=> #<Tmodel _id: 535feab26c757315a4000000, created_at: nil, updated_at: nil, weight: 70.0, height: 170, bmi: nil>
b.save
b
=> #<Tmodel _id: 535feab26c757315a4000000, created_at: 2014-04-29 18:13:45 UTC, updated_at: 2014-04-29 18:13:45 UTC, weight: 70.0, height: 170, bmi: 24.221453287197235>
b=Tmodel.new(重量:70,高度:170)
=> #
b、 拯救
B
=> #
正如我所说,这两种方法都有效,但我不确定哪一种是正确的


我使用的是mongoid 4.0beta和rails 4.0.4。

您可以使用第二种方法,因为每次身高和体重发生变化时,它都会在保存之前更新值。如果您只想在创建文档时计算bmi,您可以使用第一种方法,也可以在创建之前使用回调。

事实上这是一个很好的观点。代码看起来仍然很笨拙,这是正确的方法吗?还是我看错了什么?谢谢,这解决了我的问题。不管怎样,我搜索了很多来找到如何实现这一点,所以它让我想:1)我很笨,很明显它甚至不值得一篇博文,或者2)我做错了什么(不知何故)。你知道这在将来会有什么缺点吗?不,这没有缺点,直到这些在保存之前的回调被弃用,这不会发生,因为它被广泛使用。。。
before_save :calc_bmi

field :weight, type: Integer
field :height, type: Integer
field :bmi, type: Float

def calc_bmi
  self.bmi = self.weight / ((self.height.to_f/100) ** 2)
end
b = Tmodel.new(weight: 70, height: 170)
=> #<Tmodel _id: 535feab26c757315a4000000, created_at: nil, updated_at: nil, weight: 70.0, height: 170, bmi: nil>
b.save
b
=> #<Tmodel _id: 535feab26c757315a4000000, created_at: 2014-04-29 18:13:45 UTC, updated_at: 2014-04-29 18:13:45 UTC, weight: 70.0, height: 170, bmi: 24.221453287197235>