Rails: ActiveResource - могу ли я установить идентификатор явно? - PullRequest
6 голосов
/ 02 марта 2009

Я использую ActiveResource в Rails для управления объектами в отдельной базе данных через REST.

Я пытался явно управлять идентификаторами удаленных ресурсов, поскольку для текущего случая проще всего просто повторно использовать идентификатор локального ресурса, а не поддерживать другое поле.

К сожалению, я не смог заставить это работать, поскольку код для new? в ActiveResource::Base равен

  def new?
    id.nil?
  end

и save - это

 def save
   new? ? create : update
 end

Таким образом, по определению невозможно установить идентификатор ресурса и сохранить его как новый ресурс.

create и update являются защищенными методами, поэтому, если бы я взломал код ActiveResource :: Base, возможно, это могло бы заставить его работать, но я не хочу этого делать.

Есть ли правильный способ сделать это? Или то, что я пытаюсь сделать, просто плохо, и я не должен этого делать?

Ответы [ 2 ]

4 голосов
/ 22 сентября 2009

В новых рельсах (проверено 2.3.2) можно установить id, так как логика сохранения немного изменилась (теперь записи имеют логическое поле @newrecord для устранения этого id.nil?).

record = Model.new
record.id = 123
record.save!
2 голосов
/ 02 марта 2009

Вы работаете против намерений ActiveResource. ActiveResource предоставляет интерфейс для веб-сервисов REST, которые по соглашению возвращают назначенный идентификатор при создании.

Тем не менее, если вы управляете ресурсом, который используете, и изменили его поведение для получения идентификатора при сохранении новой записи, вы можете изменить ActiveResource :: Base для соответствия. Люди в Rails нередко делают дополнения и изменения в базовых классах; вы просто помещаете свой патч в lib и включаете его где-нибудь в свой стартап.

Не думаю, что это хорошая идея, обязательно, но это возможно. :)

...