Имеет Много Через Ассоциацию Полиморфная Ошибка - PullRequest
0 голосов
/ 07 сентября 2010

С Rails 3 out мне было интересно, есть ли какой-то новый способ создания has_many: посредством ассоциации с полиморфной моделью? Если нет, то какой лучший способ сделать это?

Вот с чем я работаю

class Page < ActiveRecord::Base
end

class Text < ActiveRecord::Base
end

class Picture < ActiveRecord::Base
end

Текст и изображения - это контент, принадлежащий одной или нескольким страницам. Каждая страница имеет один или несколько элементов контента (текст или рисунок) Я хотел бы иметь возможность сделать это:

page.content => ["text item 1", "text item 2", "picture 1"]
picture.pages => ["page 3", "page 7"]

Как я уже упоминал выше, я работаю с Rails 3. Есть идеи?

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Я бы использовал HMT и STI:

class Page < ActiveRecord::Base
  has_many :assets, :through => :page_components

  def content
    self.assets
  end
end

class PageComponent < ActiveRecord::Base
  # could also use HABTM
  belongs_to :page
  belongs_to :asset
end

class Asset < ActiveRecord::Base
  has_many :pages, :through => :page_components
end

class Text < Asset
  # inherits .pages association method from Asset
end

class Picture < Asset
  # so does this.
end

# class Video < Asset...
1 голос
/ 07 сентября 2010

Нет никакой разницы в рельсах 3 и 2.

class Page < ActiveRecord::Base
  belongs_to :text  # foreign key - text_id
  belongs_to :picture     # foreign key - picture_id
end
class Text < ActiveRecord::Base
  has_many : pictures
  has_many :pictures, :through => :pages
end
class Picture < ActiveRecord::Base
  has_many :assignments
  has_many :texts, :through => :pages
end

Вторая идея

Ваш последний комментарий заставил меня подумать, что у вас может быть тонна content_types или даже больше, что content_types могут быть сгенерированы на стороне клиента.

Вот альтернатива, почему бы не сделать только одну модель, Page - и сделать так, чтобы она имела атрибуты, отражающие ее content_type. Тогда вы можете установить с ними отношения, как это ..

@show_texts = Page.find(:all).select{ |p| p.text != nil }.collect{|p| p.id}.inspect

И так далее, и так далее. Просто идея. Честно говоря, я попытался бы реорганизовать этот код выше для дружественной к SQL версии, потому что это довольно много способов поразить БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...