对于具有列的用户模型: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?
答案 0 :(得分:4)
第1营地:关于配置的公约。此外,self.first_name
不适用于私人访问者。
阵营2:你知道什么是一目了然,而你可能会忘记没有明确接收者的方法。
最后,这是一个意见问题,所以我投票结束。但是,值得深思:
避免
self
不需要的地方。 (仅在调用自写访问器时才需要。)
GitHub style guide(基于bbatsov风格指南):
避免明确使用
self
作为内部类或实例消息的接收者,除非指定由变量隐藏的方法。