我正在研究一個多站點CMS,它在站點之間具有交叉發佈的概念。多種類型的內容(文章,活動,BIOS等)可以與許多網站相關聯,並且網站可以包含許多內容。內容片段和網站之間的多對多關聯還必須支持關聯的每個內容項目的幾個共同屬性 - 網站創建的概念(這是內容出現的原始網站?)以及概念給定關聯網站上給定內容的「主要」和「次要」內容狀態。Rails中的雙向多態聯接模型?
我的想法是創建一個名爲ContentAssociation的多態連接模型,但我無法讓多態關聯按照我的預期行事,而且我想知道是否我可能會討論這一切。
這裏是我的設置爲連接表和型號:
create_table "content_associations", :force => true do |t|
t.string "associable_type"
t.integer "associable_id"
t.integer "site_id"
t.boolean "primary_eligible"
t.boolean "secondary_eligible"
t.boolean "originating_site"
t.datetime "created_at"
t.datetime "updated_at"
end
class ContentAssociation < ActiveRecord::Base
belongs_to :site
belongs_to :associable, :polymorphic => true
belongs_to :primary_site, :class_name => "Site", :foreign_key => "site_id"
belongs_to :secondary_site, :class_name => "Site", :foreign_key => "site_id"
belongs_to :originating_site, :class_name => "Site", :foreign_key => "site_id"
end
class Site < ActiveRecord::Base
has_many :content_associations, :dependent => :destroy
has_many :articles, :through => :content_associations, :source => :associable, :source_type => "Article"
has_many :events, :through => :content_associations, :source => :associable, :source_type => "Event"
has_many :primary_articles, :through => :content_associations,
:source => :associable,
:source_type => "Article",
:conditions => ["content_associations.primary_eligible = ?" true]
has_many :originating_articles, :through => :content_associations,
:source => :associable,
:source_type => "Article",
:conditions => ["content_associations.originating_site = ?" true]
has_many :secondary_articles, :through => :content_associations,
:source => :associable,
:source_type => "Article",
:conditions => ["content_associations.secondary_eligible = ?" true]
end
class Article < ActiveRecord::Base
has_many :content_associations, :as => :associable, :dependent => :destroy
has_one :originating_site, :through => :content_associations,
:source => :associable,
:conditions => ["content_associations.originating_site = ?" true]
has_many :primary_sites, :through => :content_associations,
:source => :associable
:conditions => ["content_associations.primary_eligible = ?" true]
has_many :secondary_sites, :through => :content_associations,
:source => :associable
:conditions => ["content_associations.secondary_eligible = ?" true]
end
我已經嘗試了很多上述關聯聲明的變體,但無論我做什麼,我似乎無法得到我想
@site = Site.find(2)
@article = Article.find(23)
@article.originating_site = @site
@site.originating_articles #=>[@article]
的行爲或該
@site.primary_articles << @article
@article.primary_sites #=> [@site]
是Rails的內置多態性錯誤機制來影響站點及其各種內容之間的這些連接?這似乎是有用的,因爲我需要以多對多的方式將多個不同的模型連接到一個共同的模型,但我很難找到任何以這種方式使用它的例子。
也許複雜性的一部分是我需要在兩個方向上進行關聯 - 即查看與給定文章關聯的所有網站和查看與給定網站關聯的所有文章。我聽說過插件has_many_polymorphs,它看起來可能會解決我的問題。但我試圖在這裏使用Rails 3,不確定它是否支持。
任何幫助都非常感謝 - 即使它只是更多地闡明瞭我在這種情況下對多態性使用的不完全理解。
在此先感謝!
'primary_articles','secondary_articles'和'originating_articles'應該是範圍而不是關聯。 – 2010-08-17 23:03:48