Вопрос

Допустим, я пишу библиотечное приложение для издательской компании, у которой уже есть приложение 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
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top