Вопрос

Моя модель «DataFile» имеет кучу полей, которые я хотел бы установить извне модели, например,

file = DataFile.new
file.owner = 123

Теперь, насколько я знаю, мне пришлось разместить в моей модели «ATTR_ACCSORSE: FIELD» для каждого поля, которое я хотел бы изменить снаружи. Тем не менее, приведенный выше код работает нормально, не определяя никаких ATTR_ACCESSORS, установив поле владельца на 123. Почему это?

Я ожидал получить ошибку «метод не определен» или что -то в этом роде.

Это было полезно?

Решение

Поскольку ORM Rails использует шаблон Activerecord, два метода создаются автоматически для каждого столбца в базе данных, связанной с этой таблицей: Столбец, а также ColumnName =. Анкет Это происходит «автоматически» в результате унаследования вашей модели от Activerecord :: Base. Эти методы определяются с использованием средств метапрограммы Ruby и создаются динамически во время создания класса.

Для получения дополнительной информации о том, что именно происходит, я посмотрел на источник Rails. Тем не менее, выше, вероятно, достаточно, чтобы дать вам рабочее понимание того, что происходит.

Другие советы

Дрю и Зепплок поняли это правильно, но я просто добавлю еще одну вещь. Документы, которые Rails (на самом деле, ActiveRecord) создает для полей базы данных, не являются аксессурами Ruby, и если вы используете скрипт/консоль, вы увидите, что владелец не является переменной экземпляра объектного файла.

Скорее всего, вы никогда не заметите этого, пока не выйдете в сторону от стандартных аксессов и не попытаетесь манипулировать @owner в методе в файле. Если вы изучаете Ruby в то же время, когда вы изучаете рельсы (что я и сделал), вероятно, вы наткнутесь на это в какой -то момент. Это причина, по которой вам нужно написать:

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner = owner << " no longer owns this"
    save
  end
end

вместо

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner << " no longer owns this"
    save
  end
end

Скорее всего, «владелец» является частью вашей модели базы данных. Документы для полей базы данных созданы для вас автоматически.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top