Como faço para criar uma relação ActiveRecord a um objeto ActiveResource?
-
06-07-2019 - |
Pergunta
Vamos dizer que eu estou escrevendo um aplicativo de biblioteca para uma editora que já tem um aplicativo Pessoas.
Então, no meu aplicativo de biblioteca eu tenho
class Person < ActiveResource::Base
self.site = "http://api.people.mypublisher.com/"
end
e agora eu quero armazenar Article
s para cada Person
:
class Article < ActiveRecord::Base
belongs_to :person, :as => :author
end
Eu imagino que eu tenho a seguinte tabela no meu banco de dados:
Articles
id (PK) | title (string) | body (text) | author_id (integer)
author_id
não é exatamente um Foreign-Key, desde que eu não tenho uma tabela Pessoas. Isso deixa várias perguntas:
-
Como posso dizer ao meu
Person
objetoActiveResource
quehas_many
Articles
? -
trabalho
Articles.find(:first).author
Will? Vaibelongs_to
mesmo trabalhar, uma vez que não há nenhumaActiveRecord
e nenhuma tabela de apoio?
Solução
Como salienta, você está dando-se muito porque ActiveResource não tem associações no sentido de que ActiveRecord faz.
Você já encontrou a resposta para a pergunta # 1. Quanto à questão # 2, o seu modelo de ActiveRecord artigo deve se comportar muito bem quando configurado com um "belongs_to" associação a um modelo ActiveResource. Isso é Aritcle.find (: primeiro) .author deve retornar o objeto pessoa que você quer.
Outras dicas
Eu suponho que uma possibilidade para # 1, assumindo que eu posso conseguir nada disso funcionar, é fazer isso:
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
Mas ele perde um muito do que ofertas has_many
.
Eu acho que a melhor solução seria fazer um método que retorna um escopo.
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