Rails: ActiveResource - Posso impostare l'ID in modo esplicito?
-
03-07-2019 - |
Domanda
Sto utilizzando ActiveResource in Rails per gestire entità in un database separato su REST.
Ho cercato di gestire esplicitamente gli ID delle risorse remote, poiché nel caso attuale è più semplice riutilizzare l'ID della risorsa locale, piuttosto che mantenere un campo diverso.
Sfortunatamente non sono stato in grado di farlo funzionare perché il codice per new?
in ActiveResource :: Base
è
def new?
id.nil?
end
e salva
è
def save
new? ? create : update
end
Quindi da quello per definizione è impossibile impostare un ID di una risorsa e salvarlo come nuova risorsa.
create
e update
sono metodi protetti, quindi se avessi violato il codice ActiveResource :: Base forse questo avrebbe funzionato, ma non sopporto di farlo.
Esiste un modo corretto di farlo? O è quello che sto cercando di fare solo male, e non dovrei farlo?
Soluzione
Stai lavorando contro le intenzioni di ActiveResource. ActiveResource fornisce un'interfaccia ai servizi web REST, che per convenzione restituiscono l'ID assegnato quando si esegue una creazione.
Detto questo, se controlli la risorsa che stai utilizzando e ne hai modificato il comportamento per prendere un ID durante il salvataggio di un nuovo record, puoi modificare ActiveResource :: Base per renderlo conforme. Non è inusuale per le persone in Rails apportare aggiunte e modifiche alle classi di base; hai appena messo la tua patch in lib e includila da qualche parte nelle tue cose di avvio.
Non credo sia necessariamente una buona idea, ma è possibile. :)
Altri suggerimenti
In nuove rotaie (testato 2.3.2) è possibile impostare id, poiché la logica di salvataggio è cambiata un po '(ora i record hanno un campo booleano @newrecord per eliminare quell'id.nil?).
record = Model.new
record.id = 123
record.save!