2009-05-27 6 views
2

私が持っているこれらのテーブル:基本的にマルチブログサイトのモデル作成方法は?

**Sites** 
:has_many :blogs 
:has_many :pages 

**Blogs** 
:belongs_to :site 

**Pages** 
:belongs_to :site 
:belongs_to :blog 

は、私はどちらか、このようにルートをブログにサイトに関連するまたは関連しているページを作成することができるようにしたい:

/blogs/1/pages/1 
/sites/1/pages/2 

私の現在の設定では、私のページテーブルはblog_idとSITE_IDためFOREIGN_KEYを持っています - と私はこれをやって考えていた:

  • ページはfoが作成されている場合(ブログに属していないことを意味する)、blog_id =をNULLに設定しますが、それに応じてsite_idを設定します。

  • しかし、ブログ(既にサイトに属している)関連SITE_IDその後、私はサイトのページのリストをしたい場合は

をblog_id:私はちょうどすべてのNULL blog_idsのためのページテーブルを照会することができ、私はページをブログしたい場合、私はとの関係を介してそれらを取得しますブログはすでにあります。

更新:私は以下の回答を受け入れましたが、 "多相関連"を使用することを提案しましたが、これは単一テーブル継承を使用して行うこともできますか?もしそうなら、どの方法が良いですか?

ありがとうございました。

答えて

5

多型関連を使用できます。

pagesテーブルに外部キーとタイプ列を追加します。あなたのページが属するクラスの共通の特性を記述する形容詞を見つけてください。私はpageable(これは私にpageable_idpageable_typeの列を与えます)を考え出しました。 、お使いのモデルで

# Adds "pageable_id" integer column and "pageable_type" string column. 
t.references(:pageable, :polymorphic => true) 

多型の関係を指定has_many/belongs_toを使用した場合::あなたが移行を使用する場合は、以下のごPage移行を追加

class Site < ActiveRecord::Base 
    has_many :pages, :as => :pageable 
end 

class Blog < ActiveRecord::Base 
    has_many :pages, :as => :pageable 
end 

class Page < ActiveRecord::Base 
    belongs_to :pageable, :polymorphic => true 
end 

を見よ:

# Return all pages belonging to Site with ID 12, that is, return all pages 
# with pageable_id 12 and pageable_type "site". 
Site.find(12).pages 

# Return all pages belonging to Blog with ID 3, that is, return all pages 
# with pageable_id 3 and pageable_type "blog". 
Blog.find(3).pages 

# Returns the owner (Blog or Site) of Page with ID 27. 
Page.find(27).pageable 

私はこれが役立つことを願っていますhttp://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

基本的に、あなたは正しい軌道に乗っているが、あなたは何をしようとしてのための既存のパターンがあります:

1

あなたはポリモーフィックassocationsになっているはずです。

関連する問題