Рельсы:ActiveResource - Могу ли я задать идентификатор явно?

StackOverflow https://stackoverflow.com/questions/602162

Вопрос

Я использую 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!
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top