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

时间:2022-10-11 14:53:26

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.

但它看起来并不好。这是一个小东西的很多代码。我想减少行数。

7 个解决方案

#1


4  

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

#2


3  

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

#3


1  

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是模型的实例var。

#4


0  

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. In fact, every Ruby program can always be written on a single line.

在Ruby中,您(几乎)总是可以用分号替换换行符,以使您的代码适合更少的行。事实上,每个Ruby程序总是可以写在一行上。

#5


0  

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

看看吧

#6


0  

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 

#7


0  

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

#1


4  

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

#2


3  

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

#3


1  

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是模型的实例var。

#4


0  

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. In fact, every Ruby program can always be written on a single line.

在Ruby中,您(几乎)总是可以用分号替换换行符,以使您的代码适合更少的行。事实上,每个Ruby程序总是可以写在一行上。

#5


0  

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

看看吧

#6


0  

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 

#7


0  

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