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:

  1. come posso dire al mio oggetto Person ActiveResource che ha_many articoli ?

  2. Articles.find (: first) .author funzionerà? appartiene_to funzionerà anche dato che non esiste ActiveRecord e nessuna tabella di supporto?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top