Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 我如何用更少的行写这个条件?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 我如何用更少的行写这个条件?

Ruby on rails 我如何用更少的行写这个条件?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在我的模型中编写了以下代码: percentage = 0 if self.date_of_birth.present? percentage += 15 end if self.gender.present? percentage += 15 end if self.relationship_status.present? percentage += 10 end if self.language.present? percentage += 10 end if self.q

我在我的模型中编写了以下代码:

percentage = 0
if self.date_of_birth.present?
  percentage += 15
end
if self.gender.present?
  percentage += 15
end
if self.relationship_status.present?
  percentage += 10
end
if self.language.present?
  percentage += 10
end
if self.qualification.present?
  percentage += 10
end
if self.interests.present?
  if self.interests.count >= 10
    percentage += 10
  else
    percentage += self.interests.count * 5
  end
end

但是看起来不太好。这是一个小东西的大量代码。我想减少行数。

您可以在线执行,如下所示:

percentage += 15 if self.date_of_birth.present?
percentage = 0; if date_of_birth.present? then percentage += 15 end; if gender.present? then percentage += 15 end; if relationship_status.present? then percentage += 10 end; if language.present? then percentage += 10 end; if qualification.present? then percentage += 10 end; if interests.present? then if interests.count >= 10 then percentage += 10 else percentage += interests.count*5 end end
与此相反:

if self.interests.count >= 10
    percentage += 10
else
    percentage += self.interests.count*5
end
可以使用三元运算符:

percentage += self.interests.count >= 10 ? 10 : self.interests.count*5

您可以在模型中使用实例方法:

#app/models/model.rb
class Model < ActiveRecord::Base
   def percentage
      value = 0
      values = [[:date_of_birth, 15], [:gender, 15], [:relationship_status,10], [:language,10], [:qualification, 10]]
      values.each do |attr,val|
          value += val if self.send(attr).present?
      end
      value += self.interests.count >= 10 ? 10 : self.interests.count*5 if self.interests.present?
      # Rails should return the value of the last line, which is the "value" var
   end
end

这将允许您使用@user.percentage,其中@user是模型的实例变量。

就个人而言,我不认为减少行数是个好主意,但如果您希望代码减少行数,可以这样编写:

percentage += 15 if self.date_of_birth.present?
percentage = 0; if date_of_birth.present? then percentage += 15 end; if gender.present? then percentage += 15 end; if relationship_status.present? then percentage += 10 end; if language.present? then percentage += 10 end; if qualification.present? then percentage += 10 end; if interests.present? then if interests.count >= 10 then percentage += 10 else percentage += interests.count*5 end end
在Ruby中,几乎总是可以用分号替换换行符,以使代码适合更少的行。事实上,每个Ruby程序都可以写在一行上

percentage = [
  (15 if date_of_birth.present?),
  (15 if gender.present?),
  (10 if relationship_status.present?),
  (10 if language.present?),
  (10 if qualification.present?),
  ((counts = interests.count.to_i) >= 10 ? 10 : (counts * 5)),
].compact.sum

从@sawa的答案中得到启发,来看看它

inc_att = ["date_of_birth", "gender", "relationship_status" , "language",   "qualification", "interests"]

inc_att.each do |s|

if self[s].present? && (s == "date_of_birth" || s == "gender")
  percentage += 15
elsif self[s].present? && s == "interests" && self[s].count < 10
  percentage += self[s].count * 5
else
  percentage += 10 if self[s].present?
end

end 
counts = interests.count.to_i
percentage = (counts >= 10 ? 10 : (counts * 5)) + 
  [
    date_of_birth.present?       && 15,
    gender.present?              && 15,
    relationship_status.present? && 10,
    language.present?            && 10,
    qualification.present?       && 10,
  ].select(&:itself).sum

为什么要匆忙选择答案?我喜欢这种技巧,但发现处理兴趣的路线不协调,甚至不和谐。如果删除该行,并将最后一行替换为“.compact.sum+interest\u cost,其中interest\u cost是一种方法,我会觉得更令人愉快。@CarySwoveland你可能是对的。但是,可能需要改进的是逻辑设计。这种方法的一个缺点是,如果要求和的任何值发生更改,您必须大量重写代码。是的,它只适合当前的要求。我同意行数减少不是一个好主意。语法正确的行数越少越好。每当我在一家商店的收银台看到少于10件商品的牌子时,它就会发出刺耳的声音。