Различия между *, self. * И @ * при обращении к ассоциациям / атрибутам в Ruby / Rails Models / Controllers - PullRequest
11 голосов
/ 24 июня 2011

Если предположить модель Rails с постоянными / непостоянными атрибутами, каков наилучший способ их ссылки? Если вы посмотрите на общедоступный код, используются разные шаблоны.

Например, если у вас есть связь от одной модели к другой. В чем разница между использованием self.association_name и @ association_name? . Какой способ предпочтительнее?

То же, что и с непостоянными атрибутами, определенными с attr_accessor: attr в моделях. Вы можете ссылаться на них с помощью обоих подходов: self.attr и @ attr . Какой способ предпочтительнее?

Ответы [ 2 ]

13 голосов
/ 24 июня 2011

self.x / self.x=y - это всегда вызовы метода.

(self.x - это просто сахар для self.__send__(:x), а self.x = y действительнопросто сахар для self.__send__(:x=, y))

@x, с другой стороны, относится только к переменной экземпляра .

Использование @x не будет работать с ассоциациями AR, поскольку AR определяет только x/x= (, которые являются методами ) для его магической операции.(По сути, AR просто «захватывает» намеренный доступ через эти методы и направляет через свои собственные внутренние структуры данных, которые не связаны с любыми переменными экземпляра с аналогичным именем.)

attr_accessor позволяет "обращаться к обоим путям" , потому что и только потому, что использует в качестве своей основы переменную экземпляра с тем же именем (она должна где-то хранить значение).Учтите, что attr_accessor :x эквивалентно:

def x; @x; end
def x= (y); @x = y; end

Счастливого кодирования.

6 голосов
/ 24 июня 2011

В большинстве случаев вы предпочитаете использовать attr вместо @attr. Это потому, что метод attr часто устанавливает атрибуты, если он не существует.

Например, эта модель заказа:

model Order
  have_many :items

  def total
    @total ||= items.collect(&:price).sum
  end

  def taxes
    @taxes ||= total * 0.10
  end
end

Эта модель работает нормально, если бы я использовал @total вместо total в методе taxes, вычисление завершится ошибкой, если я раньше не вызывал метод total для этого объекта.

Как указывает @pst, @association_name не работает для ассоциации, вы ДОЛЖНЫ использовать метод association_name.

Также self.attr следует использовать только для установки атрибута (вызывая self.attr=) при чтении значения, которое лучше использовать attr, см. в этой статье: Когда используется собственная модель Rails

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...