¿Cómo creo una relación ActiveRecord con un objeto ActiveResource?
-
06-07-2019 - |
Pregunta
Digamos que estoy escribiendo una aplicación de la Biblioteca para una compañía editorial que ya tiene una aplicación People.
Entonces, en mi aplicación Biblioteca tengo
class Person < ActiveResource::Base
self.site = "http://api.people.mypublisher.com/"
end
y ahora quiero almacenar Artículo
s para cada Persona
:
class Article < ActiveRecord::Base
belongs_to :person, :as => :author
end
Me imagino que tendría la siguiente tabla en mi base de datos:
Articles
id (PK) | title (string) | body (text) | author_id (integer)
author_id
no es exactamente una clave externa, ya que no tengo una tabla de personas. Eso deja varias preguntas:
-
¿cómo le digo a mi
Persona
ActiveResource
objeto quehas_many
Artículos
? -
¿Funcionará
Articles.find (: first) .author
? ¿belong_to
funcionará incluso dado que no hayActiveRecord
y no hay una tabla de respaldo?
Solución
Como usted señala, está renunciando mucho porque ActiveResource no tiene asociaciones en el sentido que ActiveRecord sí.
Ya has encontrado la respuesta a la pregunta # 1. En cuanto a la pregunta n. ° 2, su artículo modelo de ActiveRecord debería funcionar bien cuando se configura con un " pertenece_a " asociación a un modelo ActiveResource. Es Aritcle.find (: first) .author debería devolver el objeto de persona que desea.
Otros consejos
Supongo que una posibilidad para el # 1, suponiendo que pueda hacer que algo funcione, es hacer esto:
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
Pero pierde un lote de lo que has_many
ofrece.
Creo que una mejor solución sería crear un método que devuelva un alcance.
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