5

既に People アプリケーションを持っている出版社のために Library アプリケーションを書いているとしましょう。

だから私のライブラリアプリケーションでは

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

Articleそして今、私はそれぞれの sを保存したいPerson:

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

データベースに次のテーブルがあると思います。

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

author_idPeople テーブルがないため、正確には外部キーではありません。それにはいくつかの疑問が残ります:

  1. Person ActiveResourceオブジェクトにそれを伝えるにはどうすればよいhas_many Articlesですか?

  2. Articles.find(:first).authorうまくいきますか?バッキングテーブルbelongs_toがなくても機能しますか?ActiveRecord

4

3 に答える 3

5

#1の可能性の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を失います。

于 2008-10-08T16:19:31.313 に答える
2

ご指摘のとおり、ActiveResource には ActiveRecord のような関連性がないため、多くのことをあきらめています。

質問 1 の答えはすでに見つかりました。質問 2 については、ActiveResource モデルへの「belongs_to」関連付けで構成されている場合、ActiveRecord モデル Article は問題なく動作するはずです。つまり、Aritcle.find(:first).author は必要な人物オブジェクトを返す必要があります。

于 2009-07-26T01:08:31.590 に答える
0

より良い解決策は、スコープを返すメソッドを作成することだと思います。

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
于 2010-08-17T22:37:30.923 に答える