Comment créer une relation ActiveRecord avec un objet ActiveResource?
-
06-07-2019 - |
Question
Supposons que je rédige une application de bibliothèque pour une société d'édition qui possède déjà une application People.
Donc, dans mon application de bibliothèque, j'ai
class Person < ActiveResource::Base
self.site = "http://api.people.mypublisher.com/"
end
et maintenant je veux stocker Article
s pour chaque Personne
:
class Article < ActiveRecord::Base
belongs_to :person, :as => :author
end
J'imagine que j'aurais le tableau suivant dans ma base de données:
Articles
id (PK) | title (string) | body (text) | author_id (integer)
author_id
n'est pas exactement une clé étrangère, car je n'ai pas de table Personnes. Cela laisse plusieurs questions:
-
comment indiquer à mon objet
Personne
ActiveResource
qu'ila_many
Articles
? -
Articles.find (: first) .author
fonctionnera-t-il?appartient_à
même s'il n'y a pas deActiveRecord
ni de table de support?
La solution
Comme vous l'avez fait remarquer, vous abandonnez beaucoup parce qu'ActiveResource n'a pas d'associations au sens d'ActiveRecord.
Vous avez déjà trouvé la réponse à la question n ° 1. En ce qui concerne la question n ° 2, votre article de modèle ActiveRecord devrait se comporter parfaitement lorsqu'il est configuré avec un paramètre "quot_appart_to". association à un modèle ActiveResource. C'est Aritcle.find (: first) .author devrait retourner l'objet personne que vous voulez.
Autres conseils
Je suppose que l'une des possibilités pour # 1, en supposant que je puisse en obtenir le fonctionnement, est de procéder ainsi:
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
Mais il perd beaucoup de ce que has_many
propose.
Je pense qu'une meilleure solution serait de créer une méthode qui renvoie une portée.
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