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:

  1. ¿cómo le digo a mi Persona ActiveResource objeto que has_many Artículos ?

  2. ¿Funcionará Articles.find (: first) .author ? ¿ belong_to funcionará incluso dado que no hay ActiveRecord y no hay una tabla de respaldo?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top