Когда нужно использовать self в Model в Rails?

Внутри одного Model, когда у меня есть в методе операция написания переменной: потому что необходимо добавлять self для того, чтобы оно функционировало правильно?

Например, если у меня есть следующий код:

class Zombie < ActiveRecord::Base
  beffore_save :make_rotting

  def make_rotting
    if age > 20
        self.rotting = true
    end    
  end

end

С другой стороны, если я опускаю self, не funiona:

class Zombie < ActiveRecord::Base
  beffore_save :make_rotting

  def make_rotting
    if age > 20
        rotting = true  #No funciona correctamente
    end    
  end

end

Заметь: переменная age он читает ее без какой-либо проблемы в обоих случаях.

Потому что есть различие в поведении rotting с присутствием self, в то время как в age он не меняется?

3
задан 25.01.2017, 20:54
0 ответов

Когда ты делаешь rotting = true, то, что ты делаешь, состоит в том, чтобы объявлять локальную переменную, которая функционирует в области метода make_rotting и он исчезнет, когда выполнение метода закончится.
Сейчас, когда ты звонишь в self.rotting = true, ты просишь изменять признак rotting твоей настоящей инстанции zombie, что такой, как он был бы должен делаться.

В общем, в методе инстанции модели, ты был бы должен использовать self когда ты изменишь признаки, или когда будет существовать какая-то двусмысленность между тем, чтобы звонить в локальную переменную и уже определенный признак / метод, например:

  def make_rotting(age)
    if (age || self.age) > 20
        self.rotting = true
    end    
  end

Первый вызов в age он ссылается на локальную переменную, которая приходит как параметр метода, в то время как вторая (self.age) он ссылается на признак, без того, чтобы мы обязательно изменяли этот признак.

Относительно почему это то же самое звонить в age или self.age если случай одинокий читать признак, он из-за порядка, в котором ruby он старается решать вызов в age:

  • Сначала проверь в области make_rotting если существует какая-то переменная age определенная.
  • В случае когда он не найдет его, он будет искать в области инстанции zombie если ageбудь определенным.

В случае когда использует self.age, ты показываешь ясно, что я искал определение в инстанции zombie.

3
ответ дан 03.12.2019, 17:30
  • 1
    Большой вклад, в особенности explicació n порядка resolució n призыва к age. Большое спасибо. –  26.01.2017, 00:59