ruby-on-rails - Rails - 模型属性作为函数中的变量

标签 ruby-on-rails

我认为这确实是一个基本问题,但我找不到解决方案。

我有简单的帮助方法:

def getProperNutrientValue(meal)
    result = 0
  if meal.ingredients.empty?
    result
  else
    meal.ingredients.each do |i|
      result += (i.quantity * @meal.products.find(i.product_id).calorific) / 100
    end
    result
  end
end

其中“热量”是产品模型中的一个属性。

class Product < ActiveRecord::Base
  has_many :ingredients
  has_many :meals, :through => :ingredients

  validates :calorific, :numericality => true, :allow_nil => true
  validates :water, :numericality => true, :allow_nil => true

我想干燥这个函数,并将属性设置为变量。然后我将可以使用这个函数来例如水属性。 所以我想实现这样的目标:

def getProperNutrientValue(meal, attribute)
    result = 0
  if meal.ingredients.empty?
    result
  else
    meal.ingredients.each do |i|
      result += (i.quantity * @meal.products.find(i.product_id).attribute) / 100
    end
    result
  end
end

但是它当然不起作用...我该如何修复它?

最佳答案

您可以使用send(method_name)方法。我不明白使用 @meal 变量背后的逻辑。无论哪种方式,都有一些选项可以改进您的代码,例如:

def getProperNutrientValue(meal, attribute)
  result = 0
  meal.ingredients.each do |i|
    result += (i.quantity * @meal.products.find(i.product_id).send(attribute).to_i) / 100
  end
  result
end

getProperNutrientValue(meal, :calorific)

关于ruby-on-rails - Rails - 模型属性作为函数中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33978222/

相关文章:

ruby-on-rails - 在新的 MacBookPRO M1 上运行 `gem install bundler` 时出现 SSL 验证错误

ruby-on-rails - 如何使用 rails 3.2 Assets 管道在 lib/assets 中指定 js 文件的路径

ruby-on-rails - 使用 self 作为 ruby​​ 实例方法中的第一个参数

ruby-on-rails - Rails 4 应用程序 - 在哪里放置自定义 jQuery 插件以及如何包含它们

ruby-on-rails - actionmailer基于.LTD app.com/app.fr设置主机动态

ruby-on-rails - 无法安装 mysql2 0.3.14 gem

ruby-on-rails - Rails/Bootstrap/HAML - 如何将此代码转换为 HAML 显示 Flash 消息?

ruby-on-rails - Rails chart.js 数据 CoffeeScript

javascript - Rails 选择建议和远程数据

ruby-on-rails - 从 Rails 应用程序为 JSON 创建通用模板