Rails和ruby类,实例变量

时间:2014-03-27 02:24:04

标签: ruby ruby-on-rails-3

我在轨道上的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;没有自我?它不是一个局部变量吗?

3 个答案:

答案 0 :(得分:1)

ActiveRecord将为模型中的每个字段定义getter和setter,例如。在这种情况下,您将定义positive_countpositive_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

这可以确保您分配属性而不是错误地创建局部变量。