I modelli ActiveResource possono integrarsi con i modelli ActiveRecord?
-
20-08-2019 - |
Domanda
Sto lavorando a un'app Rails che fungerà da sistema di autenticazione per altre app Rails tramite la funzionalità ActiveResource di Rails.
L'app di autenticazione ha un modello ActiveRecord chiamato User
. L'app client ha un modello ActiveResource chiamato user.save
. So che nell'app client posso fare cose come has_many :contacts
e eseguirà un'operazione PUT usando XML su HTTP.
Ma cosa succede se voglio inserire nel modello contacts
della mia applicazione client Contact
o qualcosa del genere (<=> essendo un modello ActiveRecord nell'app client)? Quindi vorrei fare cose come ottenere tutti i <=> s che appartengono ad alcuni <=>.
È possibile?
(Ho notato che una domanda simile è stato chiesto, ma non c'erano molte risposte.)
Soluzione
Risposta breve: no. Le classi coinvolte in has_many
, belongs_to
, has_and_belongs_to_many
vivono in ActiveRecord e creano query SQL per far funzionare le associazioni.
Detto questo, puoi far sembrare che ci sia un'associazione, devi solo scrivere i tuoi metodi. Qual è stata la risposta più votata a quella domanda a cui ti sei collegato.
Quindi, aggiungi una colonna al tuo modello di contatto che sia user_id
o qualsiasi chiave tu debba passare al tuo User.find
modello ActiveResource e potresti far parte del contratto di associazione in questo modo:
class User < ActiveResource::Base
# boilerplate ActiveResource url stuff
def contacts
Contact.find(:all, :conditions => { :user_id => self.id })
end
end
class Contact < ActiveRecord::Model
def user
User.find_by_user_id(self.user_id)
end
end
C'è molto di più che ottieni da <=> gratuitamente, ma questa è la sostanza.
Altri suggerimenti
Questa domanda è antica, ma di recente mi sono imbattuto in questo:
Dal post:
Supporto di base per le associazioni: has_many, has_one, appartiene_to ora può essere utilizzato nei modelli ActiveResource.
Ci sono altri miglioramenti notati nel post che potrebbero giustificare una seconda occhiata ad ActiveResource anche se è stato rimosso da Rails 4.0.