2017-06-22 21 views
0

我已经写了基于哪些领域返回用户的姓名快速name模型的方法是存在的。有条件地将空间+字符串 - Rails的5

class User < ActiveRecord::Base 
    validates :first_name, 
    presence: true, 
    length: { 
     maximum: 64, 
    } 

    validates :last_name, 
    length: { 
     maximum: 64, 
    } 

    def name 
    "#{self.first_name}#{" #{self.last_name}" if self.last_name.present?}" 
    end 
end 

如果只有first_name字段存在,则它应该返回:

=> "Joe" 

如果同时,first_namelast_name字段存在,则它应该返回:

=> "Joe Bloggs" 

上面代码工作,但我觉得它可以清理很多。

是一个更优雅的方式来做到这一点?

谢谢

回答

6

您可以使用squish

它消除了从字符串的两端所有空格,也改变了多个空格之一。

def name 
    "#{self.first_name} #{self.last_name}".squish 
end 

而且,因为它是一个实例方法,你可以删除self

def name 
    "#{first_name} #{last_name}".squish 
end 

EG。

" foo bar ".squish 
#=> "foo bar" 
0

通常的做法我采取的是:

[ 
    element_1, 
    element_2, 
    ... 
    element_n 
].compact.join(" ") 

对于数据清洗的目的,您可以:

[ 
    element_1, 
    element_2, 
    ... 
    element_n 
].map(&:squish).map(&:presence).compact.join(" ") 

如果你不是使一个列表,然后在Rails中,你可以尝试:

[ 
    element_1, 
    element_2, 
    ... 
    element_n 
].map(&:squish).map(&:presence).compact.to_sentence 

...这将给你以下形式的国际化字符串:

"a, b, c, and d"