2008-10-08 4 views
5

Angenommen, ich schreibe eine Bibliotheksanwendung für einen Verlag, der bereits über eine Anwendung für Personen verfügt.Wie erstelle ich eine ActiveRecord-Beziehung zu einem ActiveResource-Objekt?

Also in meiner Library-Anwendung habe ich

class Person < ActiveResource::Base 
    self.site = "http://api.people.mypublisher.com/" 
end 

und jetzt will ich für jeden PersonArticle s speichern:

class Article < ActiveRecord::Base 
    belongs_to :person, :as => :author 
end 

Ich stelle mir vor ich die folgende Tabelle in meiner Datenbank haben würde:

Articles 
id (PK) | title (string) | body (text) | author_id (integer) 

author_id ist nicht gerade ein Foreign-K Ey, da ich keinen People-Tisch habe. Das lässt einige Fragen:

  1. wie kann ich sagen, mein PersonActiveResource Objekt, dass es has_manyArticles?

  2. Wird Articles.find(:first).author funktionieren? Wird belongs_to sogar funktionieren, da es keine und keine Backing-Tabelle gibt?

Antwort

2

Wie Sie darauf hinweisen, geben Sie viel auf, weil ActiveResource keine Assoziationen in dem Sinne hat, wie ActiveRecord.

Sie haben die Antwort auf Frage 1 bereits gefunden. Wie bei Frage 2 sollte sich Ihr ActiveRecord-Modellartikel gut verhalten, wenn er mit einer Zuordnung "gehört zu" zu einem ActiveResource-Modell konfiguriert wurde. Das ist Aritcle.find (: first) .author sollte das gewünschte Personenobjekt zurückgeben.

5

ich eine Möglichkeit nehme an, für # 1, vorausgesetzt, ich kann irgendetwas davon bekommen arbeiten, ist dies zu tun:

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 

Aber es verliert einen viel was has_many Angebote.

0

Ich denke, eine bessere Lösung wäre eine Methode, die einen Bereich zurückgibt.

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