Я не совсем уверен, что именно вы пытаетесь сделать, но если вы пытаетесь найти объект, который «владеет» картинкой, вы должны использовать поле imageable_type для получения имени класса. Вам даже не нужен вспомогательный метод для этого, просто
def show
@picture = Picture.find(params[:id])
@parent = @picture.imagable
#=> so on and so forth
end
Обновление
Для действия индекса вы можете сделать
def index
@pictures = Picture.includes(:imagable).all
end
Это создаст для вас все «образы».
Обновление II: Гнев Поли
Для вашего нового метода вы можете просто передать идентификатор своему конструктору, но если вы хотите создать экземпляр родительского объекта, вы можете получить его по URL-адресу, например
def parent
@parent ||= %w(employee product).find {|p| request.path.split('/').include? p }
end
def parent_class
parent.classify.constantize
end
def imageable
@imageable ||= parent_class.find(params["#{parent}_id"])
end
Конечно, вы можете определить константу в вашем контроллере, которая содержит возможных родителей, и использовать ее вместо явного перечисления их в методе. Использование объекта пути запроса кажется мне более «Rails-y».