ActiveResourceオブジェクトへのActiveRecord関係を作成するにはどうすればよいですか?
-
06-07-2019 - |
質問
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
は厳密には外部キーではありません。それにはいくつかの質問があります:
-
Person
ActiveResource
オブジェクトにhas_many
Articles
と伝えるにはどうすればよいですか? -
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
所属していません StackOverflow