Рельсы:ActiveResource - Могу ли я задать идентификатор явно?
-
03-07-2019 - |
Вопрос
Я использую ActiveResource в Rails для управления объектами в отдельной базе данных поверх REST.
Я пытался явно управлять идентификаторами удаленных ресурсов, так как в текущем случае проще всего просто повторно использовать идентификатор локального ресурса, а не поддерживать другое поле.
К сожалению, мне не удалось заставить это работать в качестве кода для new?
в ActiveResource::Base
является
def new?
id.nil?
end
и save
является
def save
new? ? create : update
end
Таким образом, исходя из этого, по определению невозможно установить идентификатор ресурса и сохранить его как новый ресурс.
create
и update
это защищенные методы, поэтому, если бы я взломал код ActiveResource::Base, возможно, это заставило бы его работать, но я не хочу этого делать.
Есть ли правильный способ сделать это?Или то, что я пытаюсь сделать, просто плохо, и я не должен этого делать?
Решение
Вы работаете против намерений ActiveResource.ActiveResource предоставляет интерфейс для веб-сервисов REST, которые по соглашению возвращают назначенный идентификатор при выполнении create.
Тем не менее, если вы контролируете ресурс, который используете, и вы изменили его поведение, чтобы принимать идентификатор при сохранении новой записи, вы могли бы изменить ActiveResource::Base для соответствия.На самом деле нет ничего необычного в том, что люди в Rails вносят дополнения и изменения в базовые классы;вы просто помещаете свой патч в библиотеку и включаете его где-нибудь в свой материал для запуска.
Я не думаю, что это хорошая идея, обязательно, но это возможно.:)
Другие советы
В новых rails (протестировано 2.3.2) id может быть установлен, так как логика сохранения немного изменилась (теперь записи имеют логическое поле @newrecord, чтобы исключить этот id.nil?).
record = Model.new
record.id = 123
record.save!