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