Я создал небольшое приложение для рельсов на основе вашего примера. И это отлично работает.
User.create
SiteBlog.create
SiteBlog.first.owners << User.first
Это создает запись о владельце
#<Ownership id: 5, ownable_id: 5, ownable_type: "Blog", user_id: 5, created_at: 2012-01-17 20:14:01", updated_at: "2012-01-17 20:14:01">
Как вы видите, ownable_type - это "Blog", а не "SiteBlog". Тогда:
SiteBlog.first.owners
SiteBlog Load (0.3ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."type" IN ('SiteBlog') LIMIT 1
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "ownerships" ON "users"."id" = "ownerships"."user_id" WHERE "ownerships"."ownable_id" = 5 AND "ownerships"."ownable_type" = 'Blog'
=> [#<User id: 5, created_at: "2012-01-17 19:44:45", updated_at: "2012-01-17 19:44:45">]
Итак - запрос работает.
А вот и основная часть. Посмотрите на activerecord / lib / activerecord / association / association.rb:
def creation_attributes
attributes = {}
if reflection.macro.in?([:has_one, :has_many]) && !options[:through]
attributes[reflection.foreign_key] = owner[reflection.active_record_primary_key]
if reflection.options[:as]
attributes[reflection.type] = owner.class.base_class.name
end
end
attributes
end
В частности, эта строка сообщает, что Rails должен писать имя базового класса - это Blog, а не SiteBlog:
attributes[reflection.type] = owner.class.base_class.name
Итак, похоже, все в порядке с вашим примером и поведением Rails.