Ruby on Rails计算

时间:2011-10-14 23:33:49

标签: ruby-on-rails

实际上我正在尝试对项目执行乘法。我有2个模型:父模型和子模型。我想通过调用父模型在父视图中显示对子模型执行的乘法结果乘法方法。这是代码:

app / models / drink.rb又名儿童模型

class Drink < ActiveRecord::Base
  belongs_to :menu 
  before_create :total_amount  
  before_save :total_amount 

  def total_amount
    self.quantity * self.price * 1.30
end   
end 

&GT;在app / models / menu.rb中称为父模型

class Menu < ActiveRecord::Base
    has_many :drinks, :dependent => :destroy
    accepts_nested_attributes_for :drinks, :allow_destroy => true

end  
在views / menu / show.html.erb

<td><%=number_to_currency(@menu.total_amount) %> </td>

和错误消息:

  

未定义的方法`total_amount'为nil:NilClass

显然,total_amount是模特饮料的一个属性。我做错了什么。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

  

显然,total_amount是模型饮料的一个属性。

是的,该方法是在饮料模型中(顺便说一句,如果它是一个属性,那么它在您的迁移中被声明。您设置的方式total_amount将不会保存在数据库中),但是,你是在菜单实例上调用它。

正如Misha M所说,@ menu.drinks.total_amount。

答案 1 :(得分:1)

您需要在Menu类中添加一个名为total_amount的函数,然后让它遍历所有饮品,并总计每种饮品的总量。

答案 2 :(得分:1)

事实上问题是饮料的数量和价格没有设定。解决方案的一部分来自Wizard of Ogz。通过尝试解决“nil”无法强制进入BigDecimal的事实“我也得到了这个问题的解决方案。所以这就是解决方案

1-app / models / drink.rb aka child model 应用于self.quantity和self.price将方法转换为字符串(to_s)然后转换为大小数(to_d)

class Drink < ActiveRecord::Base
  belongs_to :menu 
  before_save :total_amount 

  def total_amount
    self.quantity.to_s.to_d * self.price.to_s.to_d * 1.30
  end   
end

2-app / models / drink.rb又名儿童模型 在将数据保存到数据库之前验证价格和数量的存在

class Drink < ActiveRecord::Base
      belongs_to :menu 
      before_save :total_amount

      validates :price, :presence => true 
      validates :quantity, :presence => true 

      def total_amount
        self.quantity.to_s.to_d * self.price.to_s.to_d * 1.30
      end   
end

3-app / views / menus / show.html.erb又名父模型

只需将方法total_amount应用于dink aka child(嵌套)模型,如下所示:

<td><%=number_to_currency(drink.total_amount) %> </td>

感谢Wizard of OgzMitch DempseysosbornMisha M