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 Articles 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:

  1. Como posso dizer ao meu Person objeto ActiveResource que has_many Articles?

  2. trabalho Articles.find(:first).author Will? Vai belongs_to mesmo trabalhar, uma vez que não há nenhuma ActiveRecord e nenhuma tabela de apoio?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top