Как создать отношение ActiveRecord к объекту ActiveResource?
-
06-07-2019 - |
Вопрос
Допустим, я пишу библиотечное приложение для издательской компании, у которой уже есть приложение 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. Это оставляет несколько вопросов:
как мне сообщить моему объекту Person
ActiveResource
, что он has_many
Articles
?
Будет ли Articles.find (: first) .author
работать? Будет ли own_to
работать, даже если нет ActiveRecord
и вспомогательной таблицы?
Решение
Как вы указали, вы много сдаётесь, потому что ActiveResource не имеет ассоциаций в том смысле, как ActiveRecord. Р>
Вы уже нашли ответ на вопрос № 1. Что касается вопроса №2, ваша статья модели ActiveRecord должна вести себя отлично, если настроена с параметром " assign_to " связь с моделью ActiveResource. То есть Aritcle.find (: first) .author должен вернуть нужный вам объект person. Р>
Другие советы
Я полагаю, что одна из возможностей для №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
.
Я думаю, что лучшим решением было бы создание метода, возвращающего область видимости.
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