在模型中访问时,使用attribute_name或self.attribute_name是否更好?

时间:2015-08-26 01:18:31

标签: ruby-on-rails ruby ruby-on-rails-4 model getter-setter

对于具有列的用户模型:first_name和:last_name,编写full_name方法的最佳方法是什么。两者似乎都有效。

class User < ActiveRecord::Base

    def full_name
       first_name + last_name
    end

end

class User < ActiveRecord::Base

    def full_name
       self.first_name + self.last_name
    end

end

我看过下面的SO帖子,但不确定

为什么ruby / rails / activerecord中始终不需要自我?

  

这是因为属性/关联实际上是   方法(getters / setters)而不是局部变量。当你说   &#34; parent = value&#34; Ruby假设您要将值赋给   局部变量父。

     

在堆栈的某个地方有一个setter方法&#34; def parent =&#34;并   打电话说你必须使用&#34; self.parent =&#34;告诉红宝石你真的   想要调用一个setter而不只是设置一个局部变量。

     

当涉及到getter时,Ruby会查看是否存在局部变量   首先,如果找不到,那么它会尝试找到一个方法   同名,这就是为什么你的getter方法在没有&#34; self&#34;。

的情况下工作的原因      

换句话说,它不是Rails的错,但它是Ruby的工作方式   固有&#34;

Why isn't self always needed in ruby / rails / activerecord?

为什么使用“self”访问ActiveRecord / Rails模型属性?

  

&#34;通常使用self是为了强迫Ruby将其识别为一种方法   调用而不是将其误解为变量。没有先验知识   一个名为day =的方法,然后是day =&#34; x&#34; Ruby看起来像一个变量   分配。 self.day =&#34; x&#34;总是一个方法调用。

     

这是麻烦的原因是因为名称和名称=方法   在解析User类文件后动态添加。首先   Rails在使用模型时所做的事情是make关联的方法   数据库字段,但这会在解析user.rb文件后发生。&#34;

Why use "self" to access ActiveRecord/Rails model properties?

1 个答案:

答案 0 :(得分:4)

第1营地:关于配置的公约。此外,self.first_name不适用于私人访问者。

阵营2:你知道什么是一目了然,而你可能会忘记没有明确接收者的方法。

最后,这是一个意见问题,所以我投票结束。但是,值得深思:

bbatsov style guide

  

避免self不需要的地方。 (仅在调用自写访问器时才需要。)

GitHub style guide(基于bbatsov风格指南):

  

避免明确使用self作为内部类或实例消息的接收者,除非指定由变量隐藏的方法。