Pregunta

Estoy usando ActiveResource en Rails para administrar entidades en una base de datos separada sobre REST.

He estado tratando de administrar explícitamente los ID de los recursos remotos, en el caso actual, es más simple simplemente reutilizar el ID del recurso local, en lugar de mantener un campo diferente.

Lamentablemente, no he podido hacer que esto funcione, ya que el código para new? en ActiveResource :: Base es

  def new?
    id.nil?
  end

y guardar es

 def save
   new? ? create : update
 end

Por lo tanto, a partir de eso, por definición, es imposible establecer un ID de un recurso y guardarlo como un nuevo recurso.

create y update son métodos protegidos, por lo que si hackeo el código ActiveResource :: Base quizás eso lo haría funcionar, pero soy reacio a hacerlo.

¿Hay una forma correcta de hacer esto? ¿O es lo que estoy tratando de hacer simplemente malo, y no debería hacerlo?

¿Fue útil?

Solución

Estás trabajando contra las intenciones de ActiveResource. ActiveResource proporciona una interfaz para los servicios web REST, que por convención devuelven la ID asignada cuando haces una creación.

Dicho esto, si controla el recurso que está utilizando y ha modificado su comportamiento para tomar una identificación al guardar un nuevo registro, puede modificar ActiveResource :: Base para cumplir. Realmente no es raro que la gente en Rails haga adiciones y cambios a las clases base; acaba de poner su parche en lib e incluirlo en algún lugar de sus cosas de inicio.

No creo que sea una buena idea, necesariamente, pero es posible. :)

Otros consejos

En nuevos rieles (probado 2.3.2) se puede establecer la identificación, ya que la lógica de guardado ha cambiado un poco (ahora los registros tienen el campo booleano @newrecord para eliminar esa id.nil?).

record = Model.new
record.id = 123
record.save!
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top