Понимание рубин на рельсах Activerecord модели
-
22-09-2019 - |
Вопрос
Моя модель «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
Скорее всего, «владелец» является частью вашей модели базы данных. Документы для полей базы данных созданы для вас автоматически.