ActiveResourceオブジェクトへのActiveRecord関係を作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/183604

質問

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

だから私のライブラリアプリケーションで私は持っています

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

そして各 Person Article を保存したい:

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

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

Articles
id (PK) | title (string) | body (text) | author_id (integer)
Peopleテーブルがないため、

author_id は厳密には外部キーではありません。それにはいくつかの質問があります:

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

  2. Articles.find(:first).author は機能しますか? ActiveRecord およびバッキングテーブルがない場合、 belongs_to は機能しますか?

役に立ちましたか?

解決

あなたが指摘しているように、ActiveResourceにはActiveRecordが持つような意味での関連付けがないため、多くのことをあきらめています。

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

他のヒント

#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 が提供するものの多くを失います。

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

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