Что вам нужно посмотреть, так это Полиморфные Ассоциации
http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
Полиморфные ассоциации
Несколько более сложный поворот ассоциаций - это полиморфная ассоциация. При полиморфных ассоциациях модель может принадлежать нескольким другим моделям в одной ассоциации. Например, у вас может быть модель изображения, которая принадлежит либо модели сотрудника, либо модели продукта.
class Picture < ActiveRecord::Base
belongs_to :imageable, :polymorphic => true
end
class Employee < ActiveRecord::Base
has_many :pictures, :as => :imageable
end
class Product < ActiveRecord::Base
has_many :pictures, :as => :imageable
end
Вы можете думать о полиморфном объявлении own_to как о настройке интерфейса, который может использовать любая другая модель. Из экземпляра модели Employee вы можете получить коллекцию изображений: @employee.pictures.
Аналогичным образом вы можете получить @product.pictures.
Если у вас есть экземпляр модели Picture, вы можете получить его parent через @picture.imageable. Чтобы это работало, вам нужно объявить как столбец внешнего ключа, так и столбец типа в модели, которая объявляет полиморфный интерфейс:
class CreatePictures < ActiveRecord::Migration
def change
create_table :pictures do |t|
t.string :name
t.integer :imageable_id
t.string :imageable_type
t.timestamps
end
end
end
Эту миграцию можно упростить, используя форму t.references:
class CreatePictures < ActiveRecord::Migration
def change
create_table :pictures do |t|
t.string :name
t.references :imageable, :polymorphic => true
t.timestamps
end
end
end