Как создать отношение ActiveRecord к объекту ActiveResource? - PullRequest
5 голосов
/ 08 октября 2008

Допустим, я пишу библиотечное приложение для издательской компании, у которой уже есть приложение People.

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

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

и теперь я хочу сохранить Article с для каждого 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 и стола поддержки?

Ответы [ 3 ]

5 голосов
/ 08 октября 2008

Полагаю, что одна из возможностей для №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 предлагает.

2 голосов
/ 26 июля 2009

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

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

0 голосов
/ 18 августа 2010

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

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
...