Come posso creare una relazione ActiveRecord con un oggetto ActiveResource?
-
06-07-2019 - |
Domanda
Diciamo che sto scrivendo un'applicazione Library per una casa editrice che ha già un'applicazione People.
Quindi nella mia applicazione Library ho
class Person < ActiveResource::Base
self.site = "http://api.people.mypublisher.com/"
end
e ora voglio archiviare articolo
per ogni persona
:
class Article < ActiveRecord::Base
belongs_to :person, :as => :author
end
Immagino che avrei la seguente tabella nel mio database:
Articles
id (PK) | title (string) | body (text) | author_id (integer)
author_id
non è esattamente una chiave esterna, poiché non ho una tabella People. Ciò lascia diverse domande:
-
come posso dire al mio oggetto
Person
ActiveResource
cheha_many
articoli
? -
Articles.find (: first) .author
funzionerà?appartiene_to
funzionerà anche dato che non esisteActiveRecord
e nessuna tabella di supporto?
Soluzione
Come fai notare, ti stai arrendendo molto perché ActiveResource non ha associazioni nel senso che ActiveRecord ha.
Hai già trovato la risposta alla domanda n. 1. Per quanto riguarda la domanda n. 2, l'articolo del modello ActiveRecord dovrebbe comportarsi bene se configurato con un " appartiene_a " associazione a un modello ActiveResource. Questo è Aritcle.find (: primo) .author dovrebbe restituire l'oggetto persona desiderato.
Altri suggerimenti
Suppongo che una possibilità per il n. 1, supponendo che riesca a farlo funzionare, è fare questo:
class Person < ActiveResource::Base
self.site = "http://api.people.mypublisher.com/"
def articles
Article.find(:all, :conditions => { :person_id => self.id })
end
def add_article(article)
article.person_id = self.id
end
end
Ma perde un lotto di ciò che has_many
offre.
Penso che una soluzione migliore sarebbe quella di creare un metodo che restituisca un ambito.
class Person < ActiveResource::Base
self.site = ..
.
def articles
Article.for_person(self.id)
end
end
class Article < ActiveRecord::Base
named_scope :for_person, lambda { |pid| { :conditions => { :person_id => pid }}}
end