Почему self не всегда нужен в ruby ​​/ rails / activerecord? - PullRequest
46 голосов
/ 03 марта 2011

При тестировании пары геттер / сеттер в модели рельсов я нашел хороший пример поведения, которое я всегда считал странным и непоследовательным.

В этом примере я имею дело с class Folder < ActiveRecord::Base.

Folder belongs_to :parent, :class_name => 'Folder'

В методе получения, если я использую:

def parent_name
  parent.name
end

... или ...

def parent_name
  self.parent.name
end

... результат точно такой же, я получаю имя родительской папки. Однако в методе получения, если я использую ...

def parent_name=(name)
  parent = self.class.find_by_name(name)
end

... родитель становится нулем, но если я использую ...

def parent_name=(name)
  self.parent = self.class.find_by_name(name)
end

... тогда тогда это работает.

Итак, мой вопрос: зачем вам иногда нужно объявлять self.method и почему вы можете просто использовать локальную переменную?

Кажется, что необходимость / использование self в ActiveRecord противоречива, и я хотел бы понять это лучше, поэтому я не чувствую, что всегда гадаю, нужно ли мне объявить себя или нет. Когда следует / не следует использовать self в моделях ActiveRecord?

1 Ответ

82 голосов
/ 03 марта 2011

Это потому, что атрибуты / ассоциации на самом деле являются методами (получателями / установщиками), а не локальными переменными.Когда вы заявляете «parent = value», Ruby предполагает, что вы хотите присвоить значение локальной переменной parent.

Где-то в стеке есть метод установки «def parent =», и для вызова которого вы должны использовать «self»..parent = "сказать ruby, что вы на самом деле хотите вызывать сеттер, а не просто устанавливать локальную переменную.

Когда дело доходит до геттеров, Ruby проверяет, есть ли сначала локальная переменная и не может найтиЗатем он пытается найти метод с тем же именем, поэтому ваш метод getter работает без «self».

Другими словами, это не ошибка Rails, а то, как Ruby работает по своей сути.

Надеюсь, это поможет.

...