Rails: ActiveResource - ¿Puedo configurar la ID explícitamente?
-
03-07-2019 - |
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?
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!