Frage

Lassen Sie sich sagen, ich bin eine Library-Anwendung für einen Verlag zu schreiben, die bereits eine Anwendung Personen haben.

So in meiner Library-Anwendung Ich habe

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

und jetzt will ich Articles für jeden Person 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-Key, da ich keinen Menschen Tisch. Das lässt einige Fragen:

  1. Wie kann ich feststellen, meinem Person ActiveResource Objekt, dass es has_many Articles?

  2. Wird Articles.find(:first).author Arbeit? Wird auch gegeben belongs_to arbeiten, dass es keine ActiveRecord und keine Unterstützung Tabelle?

War es hilfreich?

Lösung

Wie Sie weisen darauf hin, Sie geben viel, weil Active im Sinne keine Assoziationen haben, dass Active tut.

Sie haben bereits die Antwort # 1 zu hinterfragen. Wie bei Frage # 2, sollte Ihr Active Modell Artikel verhalten sich gut, wenn mit einem „belongs_to“ Vereinigung zu einem Active Modell konfiguriert. Das heißt Aritcle.find (: first) .author sollte die Person, Objekt zurückgeben Sie wollen.

Andere Tipps

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 ein Los , was has_many Angebote.

Ich denke, eine bessere Lösung wäre, ein Verfahren werden machen, die einen Umfang zurück.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top