【问题标题】:Inject data members to an object将数据成员注入对象
【发布时间】:2008-10-01 16:24:02
【问题描述】:

这个问题是基于another question of mine(感谢回答)。

所以如果在模型中我有这个:

def self.find_extended
    person = Person.find(:first)
    complete_name = person.firstname + ', ' + person.lastname
    return person
end

如何在 person 对象中注入完整名称,以便在我的控制器/视图中通过 person.complete_name 访问它?

感谢您的宝贵时间,
西尔维

【问题讨论】:

    标签: ruby-on-rails ruby oop


    【解决方案1】:

    我认为最好的方法是在您的 Person 类中创建 complete_name 属性:

    def complete_name
      firstname + ', ' + lastname
    end
    

    【讨论】:

      【解决方案2】:

      如果您要遍历大量记录,那么使用插值字符串会更节省内存。

      def complete_name
        "#{firstname}, #{lastname}"
      end
      

      使用String#+ 连接字符串会在每一步创建 String 对象。换句话说,如果firstname'John' 并且lastname'Doe',那么这些字符串中的每一个都将存在于内存中并且需要在某个时候进行垃圾收集:'John''Doe'、@ 987654329@,最后是'John, Doe'。更不用说有三个方法调用而不是一个字符串插值,这在 C 中更有效地实现。

      如果您使用#{} 表示法,那么您可以避免创建'John, ' 字符串。处理一两条记录时没关系,但在用于各种方法的大型数据集中,它可以快速加起来。

      【讨论】:

        【解决方案3】:

        你可以定义:

        attr_accessor :complete_name
        

        在人员模型中,然后只需执行person.complete_name= person.firstname + ', ' + person.lastname

        【讨论】:

        • 你的回答对我来说一样好,但我发现 IDBD 的解决方案更优雅
        【解决方案4】:

        另外,还有一个简短的说明。您不需要 Ruby 中的 return 语句。将返回您方法中的最后一条语句。

        【讨论】:

          猜你喜欢
          • 2021-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多