2015-11-29 72 views
2

我認爲這確實是基本問題,但我找不到解決方案。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 

我想DRY這個函數,並將屬性設置爲變量。然後我會爲這個屬性使用這個函數。 所以我想實現這樣的事情:

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 

但當然這是行不通的......我該如何解決?

+0

但是我怎樣才能訪問所選屬性?通過點不起作用。也許像這樣:#{attribute},但它不工作。你明白我的問題嗎? – user2948135

+0

使用['instance_variable_get'](http://apidock.com/ruby/Object/instance_variable_get)或['send'](http://apidock.com/ruby/Object/send) – max

回答

2

您可以使用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) 
+0

正是我所需要的。萬分感謝! – user2948135

+0

是的,它看起來更乾淨。我剛換了,謝謝:) – user2948135