简体   繁体   English

如何用更少的行写这个条件?

[英]How can I write this conditional in fewer lines?

I wrote this code in my model: 我在模型中编写了以下代码:

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

But it does not look good. 但这看起来并不好。 It is a lot of code for a small thing. 小事情很多。 I want to reduce the number of lines. 我想减少行数。

You can do it inline, like this: 您可以内联,如下所示:

percentage += 15 if self.date_of_birth.present?

Instead of this: 代替这个:

if self.interests.count >= 10
    percentage += 10
else
    percentage += self.interests.count*5
end

You can use a ternary operator: 您可以使用三元运算符:

percentage += self.interests.count >= 10 ? 10 : self.interests.count*5
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

You could use an instance method in your model: 您可以在模型中使用实例方法:

#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

This would allow you to use @user.percentage , where @user is your instance var for the model. 这将允许您使用@user.percentage ,其中@user是您的模型实例@user

Personally, I don't think that "less lines" is a good idea, but if you want your code in less lines, you can write it like this: 就我个人而言,我认为“减少行数”不是一个好主意,但是如果您希望代码减少行数,则可以这样编写:

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

In Ruby, you can (almost) always replace linebreaks with semicolons to make your code fit on less lines. 在Ruby中,您可以(几乎)始终用分号替换换行符,以使代码适合较少的行。 In fact, every Ruby program can always be written on a single line. 实际上, 每个 Ruby程序始终可以在一行上编写。

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 

Have a look into it 看看吧

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 

Inspired by @sawa's answer: 受到@sawa的答案的启发:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM