Как создать связь ActiveRecord с объектом ActiveResource?

Допустим, я пишу приложение «Библиотека» для издательской компании, у которой уже есть приложение «Люди».

Итак, в моем приложении библиотеки у меня есть

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

и теперь я хочу хранить Articles для каждого Person:

class Article < ActiveRecord::Base
  belongs_to :person, :as => :author
end

Я предполагаю, что у меня будет следующая таблица в моей базе данных:

Articles
id (PK) | title (string) | body (text) | author_id (integer)

author_id не совсем внешний ключ, так как у меня нет таблицы People. Это оставляет несколько вопросов:

  1. как мне сказать моему Person ActiveResource объекту, что он has_many Articles?

  2. Будет ли работать Articles.find(:first).author? Будет ли работать belongs_to, учитывая, что нет ActiveRecord и нет резервного стола?


person James A. Rosen    schedule 08.10.2008    source источник


Ответы (3)


Как вы заметили, вы от многого отказываетесь, потому что ActiveResource не имеет ассоциаций в том смысле, в каком они есть у ActiveRecord.

Вы уже нашли ответ на вопрос №1. Что касается вопроса № 2, ваша статья модели ActiveRecord должна вести себя нормально, если она настроена с помощью ассоциации «belongs_to» с моделью ActiveResource. То есть Aritcle.find(:first).author должен возвращать нужный объект человека.

person cnk    schedule 26.07.2009

Я предполагаю, что одна из возможностей для # 1, предполагая, что я могу заставить что-то из этого работать, состоит в том, чтобы сделать это:

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

Но он теряет много того, что предлагает has_many.

person James A. Rosen    schedule 08.10.2008

Я думаю, что лучшим решением было бы создание метода, который возвращает область видимости.

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
person dwaynemac    schedule 17.08.2010