Я работаю над мультисайтовой CMS, которая имеет понятие перекрестной публикации среди сайтов.Несколько типов контента (Статьи, События, Биографии и т. Д.) Могут быть связаны со многими Сайтами, и Сайты могут иметь много частей контента.Ассоциация «многие ко многим» между частями контента и сайтами также должна поддерживать пару общих атрибутов для каждого связанного элемента контента - понятие происхождения сайта (это исходный сайт, на котором появился контент?), А также понятие«первичное» и «вторичное» состояние содержимого для заданной части содержимого на данном связанном сайте.
Моя идея заключалась в создании модели полиморфного объединения под названием 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 здесь и не уверен, что он поддерживается.
Любая помощь очень ценится - даже если она только проливает больше света на мое несовершенное понимание использования полиморфизма в этом контексте..
заранее спасибо!