У меня есть модель без стола:
class SomeModel
include ActiveModel::Model
attribute :foo, :integer, default: 100
end
Я пытаюсь использовать атрибут по ссылке ниже, он отлично работает в обычных моделях, но я не могу заставить его работать в модели без таблиц.
https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html
Это вызывает неопределенное
Я попытался добавить активные атрибуты записи:
include ActiveRecord::Attributes
как включение, однако это вызывает другую ошибку, связанную со схемой.
Как мне использовать атрибут в бестабличной модели? Спасибо.
Ах, это было бы позором, у него есть много удобных функций, таких как установка значений по умолчанию.
Вы можете добиться того же с attr_writer
class SomeModel
include ActiveModel::Model
attr_writer :foo
def foo
@foo || 100
end
end
Это на самом деле не достигает той же цели, поскольку ActiveRecord::Attributes делает немного больше, чем ваш обычный метод доступа, такой как приведение типов.
Вы имели в виду, поскольку ActiveModel::Attributes
делает немного больше, чем ваш средний аксессор, такой как приведение типов, а не ActiveRecord::Attributes
я думаю.
Вам нужно включить ActiveModel::Attributes
class SomeModel
include ActiveModel::Model
include ActiveModel::Attributes
attribute :foo, :integer, default: 100
end
Его почему-то нет в ActiveModel::Model
. Этот внутренний API был извлечен из ActiveRecord в Rails 5, поэтому вы можете использовать его с моделями без таблиц.
Обратите внимание, что ActiveModel::Attributes
— это НЕТ, то же самое, что и ActiveRecord::Attributes
. ActiveRecord::Attributes
— это более специализированная реализация, которая предполагает, что модель поддерживается схемой базы данных.
Я пробовал это, в исходном вопросе это вызывает ошибку, связанную с кешем схемы.
Нет, вы включили ActiveRecord::Attributes
в свой вопрос. Это совсем не одно и то же, хотя вы, кажется, путаете их. Я протестировал это в Rails 5.2.1, и он работает так, как рекламируется.
О, спасибо, я совершенно неправильно прочитал это, извиняюсь, я попробую это, спасибо.
Вы уверены, что должны быть в состоянии сделать это? Я имею в виду, может быть, даже не поддерживается использование этого вне объекта ActiveRecord::Base.