我在轨道上的ruby中有新的内容,并对以下代码有点混淆
module Comment
class CommentScore < ActiveRecord::Base
self.table_name = 'comment_scores'
# Associations
belongs_to :provider_account
# Scopes
scope :by_provider_account_id, lambda { |provider_account_id| where(provider_account_id: provider_account_id) }
# Instance methods
def set
return unless self.valid?
return if unsettable?
self.positive_count = provider_account.comment.total(:positive)
self.total = provider_account.comment.total(:all)
self.score = decimal
self.save!
end
def decimal
positive_count.to_d / total.to_d
end
end
end
从我的学习中,我了解到如果“自我”和“自我”。关键字在方法中使用,它实际上只是调用一个方法,就像在这个例子中一样,self.positive_count,调用方法&#39; positive_count&#39;在rails中,表示名为&#39; positive_count&#39;。的表格列
所以我对小数&#39;有些困惑。方法,只需使用&#39; positive_count&#39;没有自我?它不是一个局部变量吗?
答案 0 :(得分:1)
ActiveRecord将为模型中的每个字段定义getter和setter,例如。在这种情况下,您将定义positive_count
和positive_count=
。
您可以轻松调用getter,就像使用十进制方法一样。但是,要像使用set
方法那样调用setter,您需要使用self
- 否则您只需使用值在该方法中设置局部变量,而不是调用setter。 / p>
答案 1 :(得分:0)
当存在positive_count
这样的局部变量时,没有句点和参数的格式positive_count
将被解释为局部变量。如果没有,那么它将被解释为一种方法。但是,foo=
形式的方法必须是私有的。
答案 2 :(得分:0)
基于上下文和已定义的方法,Ruby将尝试确定您是在进行方法调用,还是从中读取或分配变量。与必须事先定义局部变量(int total
)的其他语言不同,或者使用不同的语法($int
)指定变量的其他语言不同,Ruby的语法更加精简。这可能会导致一些歧义。
如果有一个使用特定名称定义的方法,例如decimal
或者有一个接受值的方法,例如total=
,那么在引用它们时将进行方法调用。否则,它被认为是变量。
使用self
可避免歧义并强制进行方法调用。它通常用于确保不会出现意外创建变量的风险。
请考虑以下事项:
def example
total = 50
end
total
是变量,还是可以使用名为total=
的方法?从这个简短的例子中不清楚。默认情况下,Ruby会将其视为变量。
现在,如果数据库中有一个名为total
的列,则在加载原始模型代码后会发现。那时没有名为total=
的方法。在实例化该模型的第一个实例后,将动态创建此方法。这是您显示self
- 点符号的地方:
def example
self.total = 50
end
这可以确保您分配属性而不是错误地创建局部变量。