Ruby on rails 在模型内访问时,使用attribute\u name或self.attribute\u name更好吗
对于具有以下列的用户模型:first_name和:last_name,编写full_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用户
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