2008-10-08 12 views
5

Digamos que estoy escribiendo una aplicación de biblioteca para una empresa editorial que ya tiene una aplicación People.¿Cómo creo una relación de ActiveRecord con un objeto ActiveResource?

Así que en mi aplicación de la biblioteca que tienen

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

y ahora desea almacenar Article s para cada Person:

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 un Extranjero-K ey, ya que no tengo una mesa People. Eso deja varias preguntas:

  1. ¿Cómo le digo a mi objeto PersonActiveResource que has_manyArticles?

  2. ¿Funcionará Articles.find(:first).author? ¿Funcionará belongs_to incluso si no hay ActiveRecord y no hay tabla de respaldo?

Respuesta

2

Como señala, está renunciando a mucho porque ActiveResource no tiene asociaciones en el sentido en que ActiveRecord lo hace.

Ya encontró la respuesta a la pregunta n. ° 1. En cuanto a la pregunta n. ° 2, su artículo del modelo de ActiveRecord debería comportarse bien cuando se configura con una asociación "belongs_to" a un modelo de ActiveResource. Eso es Aritcle.find (: first) .author debe devolver el objeto persona que desee.

5

supongo que una de las posibilidades para # 1, suponiendo que puedo conseguir alguna de que funcione, es de 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 mucho de lo que has_many ofertas.

0

Creo que una mejor solución sería hacer 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 
Cuestiones relacionadas