Ruby on rails 在模型内访问时,使用attribute\u name或self.attribute\u name更好吗

Ruby on rails 在模型内访问时,使用attribute\u name或self.attribute\u name更好吗,ruby-on-rails,ruby,ruby-on-rails-4,model,getter-setter,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用户

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

class User < ActiveRecord::Base

    def full_name
       first_name + last_name
    end

end
class用户

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

为什么ruby/rails/activerecord中不总是需要self?

这是因为属性/关联实际上是 方法(getter/setter)而不是局部变量。当你说 “parent=value”Ruby假设您希望将值分配给 局部变量父项

在堆栈的某个地方有一个setter方法“def parent=”和to 打电话告诉ruby您必须使用“self.parent=”来告诉ruby 希望调用setter,而不仅仅是设置局部变量

当谈到getters时,Ruby会查看是否存在局部变量 首先,若找不到它,那个么它会尝试找到一个具有 相同的名称,这就是为什么你的getter方法没有“self”的原因

换句话说,这不是Rails的错,而是Ruby的工作方式 天生的。”

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

self的使用通常是为了迫使Ruby认识到这是一种方法 调用而不是错误地将其解释为变量。不知情 对于一个名为day=,那么day=“x”在Ruby看来就像一个变量 分配self.day=“x”始终是一个方法调用

出现问题的原因是name和name=方法 在解析用户类文件后动态添加。第一 Rails在使用模型时所做的事情是为关联的 数据库字段,但这是在解析user.rb文件后发生的。“


营地1:约定优先于配置。另外,
self.first\u name
对私人访问者不起作用

阵营2:你一眼就知道什么是什么,而你可能会忘记没有明确的接受者你有什么方法

最后,这是一个意见问题,所以我投票决定结束。然而,值得思考的是:

:

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

(基于bbatsov风格指南):

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


如果你认为第一种方法之所以有效是因为它们被解释为局部变量,那你就大错特错了。@sawa我认为第一种方法有效是因为它首先寻找了一个局部变量,但没有找到,然后寻找了一个getter方法。更新了我的问题以澄清我最初的误解。T感谢您指出这一点。如果您能提供帮助,请提供帮助!或者至少删除下一票。谢谢!谢谢。参考样式指南正是我理解最佳实践所需要的。
class User < ActiveRecord::Base

    def full_name
       self.first_name + self.last_name
    end

end