2013-08-17 157 views
0

這是代碼:如何減少Ruby代碼?

def explaination_exists 
explaination_exists_flag = false 
if self.explanation1.length > 5 
    explaination_exists_flag = true 
end 
if self.explanation2.length > 5 
    explaination_exists_flag = true 
end 
if self.explanation3.length > 5 
    explaination_exists_flag = true 
end 
if self.explanation4.length > 5 
    explaination_exists_flag = true 
end 

unless explaination_exists_flag 
    errors.add(:base, 'Atleast one explanation should be there.') 
end 
end 

我想將代碼減少到單個線路碼,由於除了交代[數字]沒有變化。

我已經試過這樣:

def explaination_exists 
explaination_exists_flag = false 
(1..4).each do |i| 
    if self."explanation#{i}".to_sym.length > 5 
    explaination_exists_flag = true 
    break 
    end 
end 
unless explaination_exists_flag 
    errors.add(:base, 'Atleast one explanation should be there.') 
end 
end 

我知道這是愚蠢的,但你可以建議我改變一些可能的工作。

謝謝!

+2

每當你有一個很長的變量名列表,看起來像var'i'..''''。您正在使用錯誤的數據結構來存儲該信息。請重構獲得'解釋'1,2,3的代碼....也許有更好的方法來存儲這些變量。可能在數組中? – bsd

回答

4
def explaination_exists 
    return if (1..4).any?{|i| send("explaination#{i}").length > 5} 
    errors.add(:base, "Atleast one explanation should be there.") 
end 
+0

其實我想檢查是否任何explain.length> 5.反正它有一些變化,謝謝! – Gaurav

+0

我個人刪除'return'並將'if'改成''unless'。 – Phrogz

+0

@Progro如果它適合一行以便我可以使用後綴語法,那麼我會這樣做。 – sawa

3

這裏是我的快速刺吧:

def explanation_exists 
    return true if [explanation1, explanation2, explanation3, explanation4].map(&:length).any? { |length| length > 5} 
    errors.add(:base, 'Atleast one explanation should be there.') 
end 
+0

甚至比我的更好:) – Amir

+0

其實最好的辦法,我總是忘記任何?方法 – jbh

+0

它給出了一個錯誤,方法「長度」未定義。不管怎麼說,多謝拉! – Gaurav

0
def explanation_exists 
    [:explanation1, :explanation2, :explanation3, :explanation4].inject(false) do |result, method| 
    result || (self.send(:method).length > 5) 
    end 
end 
0
def explaination_exists 
    return true if %w{ explanation1 explanation2 explanation3 }.map do |exp| 
       self.send("#{exp}").length > 5 
       end.detect { |e| e } 

    errors.add(:base, 'Atleast one explanation should be there.') 
end 
0

我會分離這一點,是這樣的:

def explanations 
    [explanation1, explanation2, explanation3, expanation4] 
end 

def explanation_exists 
    errors.add(:base, :explanation) unless explanations.any? { |e| e.length > 5 } 
end 

並把錯誤信息您的區域設置爲activerecord.errors.models.<your-model-name>.attributes.base.explanation(IIRC)。