Nie rozumiem co dokładnie rozumiesz przez “części wspólne tych elementów”, chyba masz na myśli interfejs wspólny dla nich wszystkich ? Jeśli np. User ma swój “Workplace” albo “Toolbox” albo Dashboard który listuje wszystkie jego “rzeczy” i te rzeczy mogą być różnego typu ale ich lista jest podobna i podobnie się zachowują (np. wszystkie mają metodę name albo title którą wykorzystasz w liście) to zw. polimorficzne się jak najbardziej do tego nadają, ale potrzebujesz do tego osobnej tabeli która będzie przechowywać powiązania, załóżmy że użytkownik ma “Dashboard” który pokazuje listę jego “rzeczy”:
[code=ruby]class User
has_many :dashboard_items, :dependent => :destroy
end
class DashboardItem
belongs_to :user
belongs_to :dashboardable, :polymorphic => true
end
class Activity
has_many :dashboard_items, :as => :dashboardable, :dependent => :destroy
end
class Project
has_many :dashboard_items, :as => :dashboardable, :dependent => :destroy
end[/code]
tabelka dashboard_items:
id
user_id
dashboardable_id
dashboardable_type (string)
Jeśli chcesz dodać jakiś obiekt (Activity lub Project) do listy obiektów “dashboardable” użytkownika to piszesz, np:
project = Project.find(1)
project.dashboard_items.create(:user_id => current_user.id)
albo w drugą stronę:
project = Project.find(1)
current_user.dashboard_items.create(:dashboardable => project)
Do kolekcji obiektów danego użytkownika dostajesz się poprzez:
current_user.dashboard_items
a do konkretnego obiektu przez interfejs :dashboardable, np:
current_user.dashboard_items.first.dashboardable
np. powyższe wywołanie zwróci obiekt Project(id = 1)
czyli możesz np. napisać:
current_user.dashboard_items.first.dashboardable.title
i to zadziała dla obiektów każdego rodzaju pod warunkiem że obsługują .title